use crate::chain_spec; use std::path::PathBuf; use structopt::StructOpt; /// Sub-commands supported by the collator. #[derive(Debug, StructOpt)] pub enum Subcommand { /// Export the genesis state of the parachain. #[structopt(name = "export-genesis-state")] ExportGenesisState(ExportGenesisStateCommand), /// Export the genesis wasm of the parachain. #[structopt(name = "export-genesis-wasm")] ExportGenesisWasm(ExportGenesisWasmCommand), /// Build a chain specification. BuildSpec(sc_cli::BuildSpecCmd), /// Validate blocks. CheckBlock(sc_cli::CheckBlockCmd), /// Export blocks. ExportBlocks(sc_cli::ExportBlocksCmd), /// Export the state of a given block into a chain spec. ExportState(sc_cli::ExportStateCmd), /// Import blocks. ImportBlocks(sc_cli::ImportBlocksCmd), /// Remove the whole chain. PurgeChain(cumulus_client_cli::PurgeChainCmd), /// Revert the chain to a previous state. Revert(sc_cli::RevertCmd), /// The custom benchmark subcommmand benchmarking runtime pallets. #[structopt(name = "benchmark", about = "Benchmark runtime pallets.")] Benchmark(frame_benchmarking_cli::BenchmarkCmd), } /// Command for exporting the genesis state of the parachain #[derive(Debug, StructOpt)] pub struct ExportGenesisStateCommand { /// Output file name or stdout if unspecified. #[structopt(parse(from_os_str))] pub output: Option, /// Id of the parachain this state is for. /// /// Default: 100 #[structopt(long, conflicts_with = "chain")] pub parachain_id: Option, /// Write output in binary. Default is to write in hex. #[structopt(short, long)] pub raw: bool, /// The name of the chain for that the genesis state should be exported. #[structopt(long, conflicts_with = "parachain-id")] pub chain: Option, } /// Command for exporting the genesis wasm file. #[derive(Debug, StructOpt)] pub struct ExportGenesisWasmCommand { /// Output file name or stdout if unspecified. #[structopt(parse(from_os_str))] pub output: Option, /// Write output in binary. Default is to write in hex. #[structopt(short, long)] pub raw: bool, /// The name of the chain for that the genesis wasm file should be exported. #[structopt(long)] pub chain: Option, } #[derive(Debug, StructOpt)] #[structopt(settings = &[ structopt::clap::AppSettings::GlobalVersion, structopt::clap::AppSettings::ArgsNegateSubcommands, structopt::clap::AppSettings::SubcommandsNegateReqs, ])] pub struct Cli { #[structopt(subcommand)] pub subcommand: Option, #[structopt(flatten)] pub run: cumulus_client_cli::RunCmd, /// Relaychain arguments #[structopt(raw = true)] pub relaychain_args: Vec, } #[derive(Debug)] pub struct RelayChainCli { /// The actual relay chain cli object. pub base: polkadot_cli::RunCmd, /// Optional chain id that should be passed to the relay chain. pub chain_id: Option, /// The base path that should be used by the relay chain. pub base_path: Option, } impl RelayChainCli { /// Parse the relay chain CLI parameters using the para chain `Configuration`. pub fn new<'a>( para_config: &sc_service::Configuration, relay_chain_args: impl Iterator, ) -> Self { let extension = chain_spec::Extensions::try_get(&*para_config.chain_spec); let chain_id = extension.map(|e| e.relay_chain.clone()); let base_path = para_config.base_path.as_ref().map(|x| x.path().join("polkadot")); Self { base_path, chain_id, base: polkadot_cli::RunCmd::from_iter(relay_chain_args) } } }