nimbus-eth1/premix/configuration.nim

119 lines
3.2 KiB
Nim
Raw Normal View History

import
std/[os, parseopt, strutils],
eth/common, stint, ../nimbus/config
from ../nimbus/chain_config import
MainNet,
RopstenNet,
RinkebyNet,
GoerliNet,
KovanNet
2019-01-09 06:37:40 +00:00
type
ConfigStatus* = enum
## Configuration status flags
Success, ## Success
EmptyOption, ## No options in category
ErrorUnknownOption, ## Unknown option in command line found
ErrorParseOption, ## Error in parsing command line option
ErrorIncorrectOption, ## Option has incorrect value
Error ## Unspecified error
2019-01-09 06:37:40 +00:00
PremixConfiguration* = ref object
dataDir*: string
2022-04-08 04:54:11 +00:00
head*: UInt256
2019-01-09 06:37:40 +00:00
maxBlocks*: int
numCommits*: int
netId*: NetworkId
2019-01-09 06:37:40 +00:00
var premixConfig {.threadvar.}: PremixConfiguration
proc getConfiguration*(): PremixConfiguration {.gcsafe.}
proc processInteger(v: string, o: var int): ConfigStatus =
## Convert string to integer.
try:
o = parseInt(v)
result = Success
except ValueError:
result = ErrorParseOption
2019-01-09 06:37:40 +00:00
proc initConfiguration(): PremixConfiguration =
result = new PremixConfiguration
const dataDir = defaultDataDir()
2019-01-09 06:37:40 +00:00
result.dataDir = dataDir
2019-01-09 06:37:40 +00:00
result.head = 0.u256
result.maxBlocks = 0
result.numCommits = 128
2020-06-19 10:52:19 +00:00
result.netId = MainNet
2019-01-09 06:37:40 +00:00
proc getConfiguration*(): PremixConfiguration =
if isNil(premixConfig):
premixConfig = initConfiguration()
result = premixConfig
2022-04-08 04:54:11 +00:00
proc processU256(val: string, o: var UInt256): ConfigStatus =
2019-01-09 06:37:40 +00:00
if val.len > 2 and val[0] == '0' and val[1] == 'x':
2022-04-08 04:54:11 +00:00
o = UInt256.fromHex(val)
2019-01-09 06:37:40 +00:00
else:
2022-04-08 04:54:11 +00:00
o = parse(val, UInt256)
2019-01-09 06:37:40 +00:00
result = Success
proc processNetId(val: string, o: var NetworkId): ConfigStatus =
2020-06-19 10:52:19 +00:00
case val.toLowerAscii()
of "main": o = MainNet
of "ropsten": o = RopstenNet
of "rinkeby": o = RinkebyNet
of "goerli": o = GoerliNet
of "kovan": o = KovanNet
template checkArgument(fun, o, value: untyped) =
2019-01-09 06:37:40 +00:00
## Checks if arguments got processed successfully
let res = fun(value, o)
2019-01-09 06:37:40 +00:00
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, value)
2019-01-09 06:37:40 +00:00
of "head":
checkArgument(processU256, config.head, value)
2019-01-09 06:37:40 +00:00
of "numcommits":
checkArgument(processInteger, config.numCommits, value)
2019-01-09 06:37:40 +00:00
config.numCommits = max(config.numCommits, 512)
2020-06-19 10:52:19 +00:00
of "netid":
checkArgument(processNetId, config.netId, value)
2019-01-09 06:37:40 +00:00
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