nimbus-eth1/premix/configuration.nim

96 lines
2.6 KiB
Nim
Raw Normal View History

2019-01-09 06:37:40 +00:00
import stint, os, parseopt, strutils
2020-06-19 10:52:19 +00:00
from ../nimbus/config import getDefaultDataDir, ConfigStatus, processInteger, PublicNetwork
2019-01-09 06:37:40 +00:00
export ConfigStatus
type
PremixConfiguration* = ref object
dataDir*: string
head*: Uint256
maxBlocks*: int
numCommits*: int
2020-06-19 10:52:19 +00:00
netId*: PublicNetwork
2019-01-09 06:37:40 +00:00
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
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
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
2020-06-19 10:52:19 +00:00
proc processNetId(val: string, o: var PublicNetwork): ConfigStatus =
case val.toLowerAscii()
of "main": o = MainNet
of "ropsten": o = RopstenNet
of "rinkeby": o = RinkebyNet
of "goerli": o = GoerliNet
of "kovan": o = KovanNet
2019-01-09 06:37:40 +00:00
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)
2020-06-19 10:52:19 +00:00
of "netid":
checkArgument processNetId, config.netId
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