4.5. kink/CONFIG_FUN_RUNNER

Read simple configuration from a config function as a map.

Example:

:CONFIG_FUN_RUNNER.require_from('kink/')

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

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

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

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

:_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

4.5.1. CONFIG_FUN_RUNNER.new($runner_config_fun)

`new` makes a function to get simple setup from config functions. Methods of config values are specified by $runner_config_fun.

Precondition:

• $runner_config_fun must be a function which takes a `runner_config` value.

`new` returns a function. Let's call this a runner function. The runner function takes a config function, which takes a config value containing the methods specified by $runner_config_fun. The runner function calls the config function with a config value, and returns a result map. See methods of `runner_config` type for entries of the result map.

4.5.2. type runner_config

Config value for CONFIG_FUN_RUNNER.new.

4.5.2.1. Rc.no_arg(Method_name)

`no_arg` specifies that a config value has a method with the specified `Method_name`, and the method does not take an argument.

Precondition:

• `Method_name` must be a str.

When the created method is called for a config value, an unspecified value is set to the result map associated with `Method_name` as the key.

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

`req_arg` specifies that a config value has a method with the specified `Method_name`, and the method takes an argument.

Preconditions:

• `Method_name` must be a str.

• $validate must be a fun which takes an argument.

When the created method is called for a config value, the argument of the method is set to the result map, associated with `Method_name` as the key.

$validate is called with the method argument before the value is set, so that it can validate the argument. If the method argument is not acceptable, $validate can raise an exception. The result of $validate is ignored.

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

`opt_arg` specifies that a config value has a method with the specified `Method_name`, and the method takes an optional argument.

Preconditions:

• `Method_name` must be a str

• $make_default must be a thunk.

• $validate must be a fun which takes an argument.

When the created method is called with an argument, the argument is set to the result map, associated with `Method_name` as the key. If the method is called without an argument, a value created by $make_default is set to the result map, associated with `Method_name` as the key.

$validate is called with the method argument before the value is set, so that it can validate the argument. If the method argument is not acceptable, $validate can raise an exception. The result of $validate is ignored.