6.7. kink/CONFIG_FUN_RUNNER

コンフィグ関数を走らせて、mapを得る。

:CONFIG_FUN_RUNNER.require_from('kink/')

:open_file <- {(:Config.opt)
  :config = Config.just{ {} }
  :Map = _run_config_fun($config)

  :Append? = Map.get('append')
  stdout.print('Append? = {}'.format(Append?.repr))

  Map.get_opt('buffer').with_elems(
    { stdout.print(', No buffer') }
    {(:Buf_size)
      stdout.print(', Buffer size = {}'.format(Buf_size))
    }
  )

  Map.get_opt('newline').with_elems(
    { stdout.print_line(', No newline') }
    {(:Newline)
      stdout.print_line(', Newline = {}'.format(Newline.repr))
    }
  )
}

:_run_config_fun <- CONFIG_FUN_RUNNER.new{(:Rc)
  Rc.no_arg('append')
  Rc.opt_arg('buffer' { 2048 })
  Rc.req_arg('newline')
}

open_file
# => Append? = false, No buffer, No newline

open_file{(:C)
  C.append
  C.buffer(1024)
  C.newline("\n")
}
# => Append? = true, Buffer size = 1024, Newline = "\n"

open_file{(:C)
  C.buffer
}
# => Append? = false, Buffer size = 2048, No newline

6.7.1. CONFIG_FUN_RUNNER.new($config)

newは、ランナー関数を戻す。ランナー関数は、コンフィグ関数を取って、コンフィグのmapを戻す。

ランナー関数の動作

ランナー関数にはコンフィグ関数が渡せる。 コンフィグ関数に渡されるコンフィグ値は、$configで指定されたメソッドを持つ。

ランナー関数はmapを戻す。mapのキーは、コンフィグメソッドの名前のstr値である。キーの同値性は、str値の同等性で決められる。mapのエントリの詳細については、config_fun_runner_config型のメソッドを見よう。

事前条件

$configはconfig_fun_runner_config値を取る関数でなければならない。

6.7.2. config_fun_runner_config型

config_fun_runner_configは、CONFIG_FUN_RUNNER.newのコンフィグ値である。

6.7.2.1. Rc.req_arg(Method_name ...[$validate={}])

req_argは、コンフィグ値が、Method_nameで指定された名前のコンフィグメソッドを持つことを指示する。コンフィグメソッドは必須の引数を取る。

コンフィグメソッドが呼ばれない場合

コンフィグメソッドが呼ばれない場合、mapはMethod_nameをキーとするエントリを持たない。

コンフィグメソッドが呼ばれたとき

コンフィグメソッドは、その引数を渡して、$validateを呼び出す。もしその引数が受け入れられない場合は、$validateは例外を投げる。

$validateが例外を投げなかった場合、Method_nameをキー、コンフィグメソッドの引数を値として、mapにエントリが書かれる。

事前条件

Method_nameはstrでなければならない。

$validateは引数をひとつ取る関数でなければならない。

6.7.2.2. Rc.req_fun(Method_name)

req_funは、Method_nameで指定された名前のコンフィグメソッドを持つことを指示する。コンフィグメソッドは、必須の引数として関数を取る。

コンフィグメソッドが呼ばれない場合

コンフィグメソッドが呼ばれない場合、mapはMethod_nameをキーとするエントリを持たない。

コンフィグメソッドが呼ばれたとき

コンフィグメソッドは、引数が関数であることをバリデートする。

バリデーションを別にすると、コンフィグメソッドの動作は、req_argで追加されたものと同じである。

事前条件

Method_nameはstrでなければならない。

6.7.2.3. Rc.no_arg(Method_name)

no_argは、コンフィグ値がMethod_nameで指定されたメソッド名のコンフィグメソッドを持つことを指示する。コンフィグメソッドは引数を取らない。

コンフィグメソッドが呼ばれない場合

コンフィグメソッドが呼ばれない場合、mapはMethod_nameをキー、falseを値とするエントリを持つ。

コンフィグメソッドが呼ばれたとき

コンフィグメソッドが呼ばれた場合、Method_nameをキー、trueを値とするエントリがmapに書かれる。

事前条件

Method_nameはstrでなければならない。

6.7.2.4. Rc.opt_arg(Method_name $make_default ...[$validate={}])

opt_argは、コンフィグ値が、Method_nameで指定された名前のコンフィグメソッドを持つことを指示する。コンフィグメソッドは、オプショナルな引数をひとつ取る。

コンフィグメソッドが呼ばれない場合

コンフィグメソッドが呼ばれない場合、mapはMethod_nameをキーとするエントリを持たない。

コンフィグメソッドに引数が渡されない場合

コンフィグメソッドが引数なしで呼ばれた場合、コンフィグメソッドは$make_defaultを引数なしで呼ぶ。

そして、Method_nameをキー、$make_defaultの結果を値とするエントリがmapに書かれる。

コンフィグメソッドに引数が渡される場合

コンフィグメソッドに引数が渡された場合、コンフィグメソッドはその引数を渡して$validateを呼び出す。引数が受け入れられない場合、$validateは例外を投げなければならない。

$validateが例外を投げなかった場合、Method_nameをキー、コンフィグメソッドの引数を値として、mapにエントリが書かれる。

事前条件

Method_nameはstrでなければならない。

$make_defaultはサンクでなければならない。

$validateは引数をひとつ取る関数でなければならない。

6.7.2.5. Rc.multi_args(Method_name ...[$validate={}])

multi_argsは、コンフィグ値が、Method_nameで指定された名前のコンフィグメソッドを持つことを指示する。

コンフィグメソッドは複数回、任意個数の引数とともに呼び出せる。引数列は、ベクタのベクタMに格納される。

コンフィグメソッドが呼ばれない場合

コンフィグメソッドが呼ばれない場合、mapはMethod_nameをキー、空のベクタ [] (これがM)を値とするエントリを持つ。

コンフィグメソッドが呼ばれたとき

コンフィグメソッドは、その引数列をそのまま渡して、$validateを呼び出す。もしその引数列が受け入れられない場合、$validateは例外を投げる。

$validateが例外を投げない場合、引数列のベクタが、ベクタMの末尾の要素として追加される。

事前条件

Method_nameはstrでなければならない。

$validateは引数をひとつ取る関数でなければならない。

:CONFIG_FUN_RUNNER.require_from('kink/')
:STR.require_from('kink/')

:run <- CONFIG_FUN_RUNNER.new{(:C)
  C.multi_args('attr'){(:Name :Val)
    STR.is?(Name) || raise('Name must be a str, but was {}'.format(Name.repr))
  }
}

:Map <- run{(:C)
  C.attr('loglevel' 'INFO')
  C.attr('timeout' 42)
}
stdout.print_line(Map.get('attr').repr) # => [["loglevel" "INFO"] ["timeout" 42]]