diff --git a/premix/configuration.nim b/premix/configuration.nim new file mode 100644 index 000000000..247e38ba1 --- /dev/null +++ b/premix/configuration.nim @@ -0,0 +1,83 @@ +import stint, os, parseopt, strutils +from ../nimbus/config import getDefaultDataDir, ConfigStatus, processInteger + +export ConfigStatus + +type + PremixConfiguration* = ref object + dataDir*: string + head*: Uint256 + maxBlocks*: int + numCommits*: int + +var premixConfig {.threadvar.}: PremixConfiguration + +proc getConfiguration*(): PremixConfiguration {.gcsafe.} + +proc initConfiguration(): PremixConfiguration = + result = new PremixConfiguration + + const dataDir = getDefaultDataDir() + + result.dataDir = getHomeDir() / dataDir + result.head = 0.u256 + result.maxBlocks = 0 + result.numCommits = 128 + +proc getConfiguration*(): PremixConfiguration = + if isNil(premixConfig): + premixConfig = initConfiguration() + result = premixConfig + +proc processU256(val: string, o: var Uint256): ConfigStatus = + if val.len > 2 and val[0] == '0' and val[1] == 'x': + o = Uint256.fromHex(val) + else: + o = parse(val, Uint256) + result = Success + +template checkArgument(fun, o: untyped) = + ## Checks if arguments got processed successfully + var res = (fun)(value, o) + if res == Success: + continue + elif res == ErrorParseOption: + msg = "Error processing option [" & key & "] with value [" & value & "]" + result = res + break + elif res == ErrorIncorrectOption: + msg = "Incorrect value for option [" & key & "] value [" & value & "]" + result = res + break + +proc processArguments*(msg: var string): ConfigStatus = + var + opt = initOptParser() + length = 0 + config = getConfiguration() + + result = Success + for kind, key, value in opt.getopt(): + case kind + of cmdArgument: + discard + of cmdLongOption, cmdShortOption: + inc(length) + case key.toLowerAscii() + of "datadir": config.dataDir = value + of "maxblocks": + checkArgument processInteger, config.maxBlocks + of "head": + checkArgument processU256, config.head + of "numcommits": + checkArgument processInteger, config.numCommits + config.numCommits = max(config.numCommits, 512) + else: + msg = "Unknown option " & key + if value.len > 0: msg = msg & " : " & value + result = ErrorUnknownOption + break + of cmdEnd: + msg = "Error processing option [" & key & "]" + result = ErrorParseOption + break