nimbus-eth2/ncli/ncli_query.nim

60 lines
1.6 KiB
Nim

import
confutils, os, strutils, chronicles, json_serialization,
stew/byteutils,
../beacon_chain/spec/[crypto, datatypes, digest],
../beacon_chain/[ssz],
../beacon_chain/ssz/dynamic_navigator
type
QueryCmd* = enum
nimQuery
get
QueryConf = object
file* {.
defaultValue: ""
desc: "BeaconState ssz file"
name: "file" }: InputFile
case queryCmd* {.
defaultValue: nimQuery
command
desc: "Query the beacon node database and print the result" }: QueryCmd
of nimQuery:
nimQueryExpression* {.
argument
desc: "Nim expression to evaluate (using limited syntax)" }: string
of get:
getQueryPath* {.
argument
desc: "REST API path to evaluate" }: string
let
config = QueryConf.load()
case config.queryCmd
of QueryCmd.nimQuery:
# TODO: This will handle a simple subset of Nim using
# dot syntax and `[]` indexing.
echo "nim query: ", config.nimQueryExpression
of QueryCmd.get:
let pathFragments = config.getQueryPath.split('/', maxsplit = 1)
let bytes =
case pathFragments[0]
of "genesis_state":
readFile(config.file.string).string.toBytes()
else:
stderr.write config.getQueryPath & " is not a valid path"
quit 1
# TODO nasty compile error here
# /home/arnetheduck/status/nim-beacon-chain/beacon_chain/ssz/navigator.nim(45, 50) template/generic instantiation of `getFieldBoundingOffsets` from here
# Error: internal error: (filename: "semtypes.nim", line: 1864, column: 21)
# let navigator = DynamicSszNavigator.init(bytes, BeaconState)
# echo navigator.navigatePath(pathFragments[1 .. ^1]).toJson