polkadot_omni_node_lib/common/
command.rs
1use crate::common::spec::BaseNodeSpec;
18use cumulus_client_cli::ExportGenesisHeadCommand;
19use frame_benchmarking_cli::BlockCmd;
20#[cfg(any(feature = "runtime-benchmarks"))]
21use frame_benchmarking_cli::StorageCmd;
22use sc_cli::{CheckBlockCmd, ExportBlocksCmd, ExportStateCmd, ImportBlocksCmd, RevertCmd};
23use sc_service::{Configuration, TaskManager};
24use std::{future::Future, pin::Pin};
25
26type SyncCmdResult = sc_cli::Result<()>;
27
28type AsyncCmdResult<'a> =
29 sc_cli::Result<(Pin<Box<dyn Future<Output = SyncCmdResult> + 'a>>, TaskManager)>;
30
31pub trait NodeCommandRunner {
32 fn prepare_check_block_cmd(
33 self: Box<Self>,
34 config: Configuration,
35 cmd: &CheckBlockCmd,
36 ) -> AsyncCmdResult<'_>;
37
38 fn prepare_export_blocks_cmd(
39 self: Box<Self>,
40 config: Configuration,
41 cmd: &ExportBlocksCmd,
42 ) -> AsyncCmdResult<'_>;
43
44 fn prepare_export_state_cmd(
45 self: Box<Self>,
46 config: Configuration,
47 cmd: &ExportStateCmd,
48 ) -> AsyncCmdResult<'_>;
49
50 fn prepare_import_blocks_cmd(
51 self: Box<Self>,
52 config: Configuration,
53 cmd: &ImportBlocksCmd,
54 ) -> AsyncCmdResult<'_>;
55
56 fn prepare_revert_cmd(
57 self: Box<Self>,
58 config: Configuration,
59 cmd: &RevertCmd,
60 ) -> AsyncCmdResult<'_>;
61
62 fn run_export_genesis_head_cmd(
63 self: Box<Self>,
64 config: Configuration,
65 cmd: &ExportGenesisHeadCommand,
66 ) -> SyncCmdResult;
67
68 fn run_benchmark_block_cmd(
69 self: Box<Self>,
70 config: Configuration,
71 cmd: &BlockCmd,
72 ) -> SyncCmdResult;
73
74 #[cfg(any(feature = "runtime-benchmarks"))]
75 fn run_benchmark_storage_cmd(
76 self: Box<Self>,
77 config: Configuration,
78 cmd: &StorageCmd,
79 ) -> SyncCmdResult;
80}
81
82impl<T> NodeCommandRunner for T
83where
84 T: BaseNodeSpec,
85{
86 fn prepare_check_block_cmd(
87 self: Box<Self>,
88 config: Configuration,
89 cmd: &CheckBlockCmd,
90 ) -> AsyncCmdResult<'_> {
91 let partial = T::new_partial(&config).map_err(sc_cli::Error::Service)?;
92 Ok((Box::pin(cmd.run(partial.client, partial.import_queue)), partial.task_manager))
93 }
94
95 fn prepare_export_blocks_cmd(
96 self: Box<Self>,
97 config: Configuration,
98 cmd: &ExportBlocksCmd,
99 ) -> AsyncCmdResult<'_> {
100 let partial = T::new_partial(&config).map_err(sc_cli::Error::Service)?;
101 Ok((Box::pin(cmd.run(partial.client, config.database)), partial.task_manager))
102 }
103
104 fn prepare_export_state_cmd(
105 self: Box<Self>,
106 config: Configuration,
107 cmd: &ExportStateCmd,
108 ) -> AsyncCmdResult<'_> {
109 let partial = T::new_partial(&config).map_err(sc_cli::Error::Service)?;
110 Ok((Box::pin(cmd.run(partial.client, config.chain_spec)), partial.task_manager))
111 }
112
113 fn prepare_import_blocks_cmd(
114 self: Box<Self>,
115 config: Configuration,
116 cmd: &ImportBlocksCmd,
117 ) -> AsyncCmdResult<'_> {
118 let partial = T::new_partial(&config).map_err(sc_cli::Error::Service)?;
119 Ok((Box::pin(cmd.run(partial.client, partial.import_queue)), partial.task_manager))
120 }
121
122 fn prepare_revert_cmd(
123 self: Box<Self>,
124 config: Configuration,
125 cmd: &RevertCmd,
126 ) -> AsyncCmdResult<'_> {
127 let partial = T::new_partial(&config).map_err(sc_cli::Error::Service)?;
128 Ok((Box::pin(cmd.run(partial.client, partial.backend, None)), partial.task_manager))
129 }
130
131 fn run_export_genesis_head_cmd(
132 self: Box<Self>,
133 config: Configuration,
134 cmd: &ExportGenesisHeadCommand,
135 ) -> SyncCmdResult {
136 let partial = T::new_partial(&config).map_err(sc_cli::Error::Service)?;
137 cmd.run(partial.client)
138 }
139
140 fn run_benchmark_block_cmd(
141 self: Box<Self>,
142 config: Configuration,
143 cmd: &BlockCmd,
144 ) -> SyncCmdResult {
145 let partial = T::new_partial(&config).map_err(sc_cli::Error::Service)?;
146 cmd.run(partial.client)
147 }
148
149 #[cfg(any(feature = "runtime-benchmarks"))]
150 fn run_benchmark_storage_cmd(
151 self: Box<Self>,
152 config: Configuration,
153 cmd: &StorageCmd,
154 ) -> SyncCmdResult {
155 let partial = T::new_partial(&config).map_err(sc_cli::Error::Service)?;
156 let db = partial.backend.expose_db();
157 let storage = partial.backend.expose_storage();
158 let shared_trie_cache = partial.backend.expose_shared_trie_cache();
159
160 cmd.run(config, partial.client, db, storage, shared_trie_cache)
161 }
162}