reth_seismic_cli/
chainspec.rs

1use reth_chainspec::ChainSpec;
2use reth_cli::chainspec::{parse_genesis, ChainSpecParser};
3use reth_seismic_chainspec::{SEISMIC_DEV, SEISMIC_DEV_OLD, SEISMIC_MAINNET};
4use std::sync::Arc;
5
6/// Optimism chain specification parser.
7#[derive(Debug, Clone, Default)]
8#[non_exhaustive]
9pub struct SeismicChainSpecParser;
10
11impl ChainSpecParser for SeismicChainSpecParser {
12    type ChainSpec = ChainSpec;
13
14    const SUPPORTED_CHAINS: &'static [&'static str] = &["dev", "mainnet", "dev-old"];
15
16    fn parse(s: &str) -> eyre::Result<Arc<Self::ChainSpec>> {
17        chain_value_parser(s)
18    }
19}
20
21/// Clap value parser for [`ChainSpec`]s.
22///
23/// The value parser matches either a known chain, the path
24/// to a json file, or a json formatted string in-memory. The json needs to be a Genesis struct.
25pub fn chain_value_parser(s: &str) -> eyre::Result<Arc<ChainSpec>, eyre::Error> {
26    Ok(match s {
27        "dev" => SEISMIC_DEV.clone(),
28        "mainnet" => SEISMIC_MAINNET.clone(),
29        "dev-old" => SEISMIC_DEV_OLD.clone(),
30        _ => Arc::new(parse_genesis(s)?.into()),
31    })
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn parse_known_chain_spec() {
40        for &chain in SeismicChainSpecParser::SUPPORTED_CHAINS {
41            assert!(<SeismicChainSpecParser as ChainSpecParser>::parse(chain).is_ok());
42        }
43    }
44}