reth_cli_commands/
dump_genesis.rs1use std::sync::Arc;
3
4use clap::Parser;
5use reth_chainspec::EthChainSpec;
6use reth_cli::chainspec::ChainSpecParser;
7
8#[derive(Debug, Parser)]
10pub struct DumpGenesisCommand<C: ChainSpecParser> {
11 #[arg(
15 long,
16 value_name = "CHAIN_OR_PATH",
17 long_help = C::help_message(),
18 default_value = C::SUPPORTED_CHAINS[0],
19 value_parser = C::parser()
20 )]
21 chain: Arc<C::ChainSpec>,
22}
23
24impl<C: ChainSpecParser<ChainSpec: EthChainSpec>> DumpGenesisCommand<C> {
25 pub async fn execute(self) -> eyre::Result<()> {
27 println!("{}", serde_json::to_string_pretty(self.chain.genesis())?);
28 Ok(())
29 }
30}
31
32impl<C: ChainSpecParser> DumpGenesisCommand<C> {
33 pub fn chain_spec(&self) -> Option<&Arc<C::ChainSpec>> {
35 Some(&self.chain)
36 }
37}
38
39#[cfg(test)]
40mod tests {
41 use super::*;
42 use reth_ethereum_cli::chainspec::{EthereumChainSpecParser, SUPPORTED_CHAINS};
43
44 #[test]
45 fn parse_dump_genesis_command_chain_args() {
46 for chain in SUPPORTED_CHAINS {
47 let args: DumpGenesisCommand<EthereumChainSpecParser> =
48 DumpGenesisCommand::parse_from(["reth", "--chain", chain]);
49 assert_eq!(
50 Ok(args.chain.chain),
51 chain.parse::<reth_chainspec::Chain>(),
52 "failed to parse chain {chain}"
53 );
54 }
55 }
56}