diff --git a/client/cli/src/arg_enums.rs b/client/cli/src/arg_enums.rs index aeb3eeacc6f2c..fb2f8fdbc21d8 100644 --- a/client/cli/src/arg_enums.rs +++ b/client/cli/src/arg_enums.rs @@ -20,26 +20,54 @@ use structopt::clap::arg_enum; -arg_enum! { - /// How to execute Wasm runtime code - #[allow(missing_docs)] - #[derive(Debug, Clone, Copy)] - pub enum WasmExecutionMethod { - // Uses an interpreter. - Interpreted, - // Uses a compiled runtime. - Compiled, +/// How to execute Wasm runtime code. +#[derive(Debug, Clone, Copy)] +pub enum WasmExecutionMethod { + /// Uses an interpreter. + Interpreted, + /// Uses a compiled runtime. + Compiled, +} + +impl std::fmt::Display for WasmExecutionMethod { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Interpreted => write!(f, "Interpreted"), + Self::Compiled => write!(f, "Compiled"), + } + } +} + +impl std::str::FromStr for WasmExecutionMethod { + type Err = String; + + fn from_str(s: &str) -> Result { + if s.eq_ignore_ascii_case("interpreted-i-know-what-i-do") { + Ok(Self::Interpreted) + } else if s.eq_ignore_ascii_case("compiled") { + #[cfg(feature = "wasmtime")] + { + Ok(Self::Compiled) + } + #[cfg(not(feature = "wasmtime"))] + { + Err(format!("`Compiled` variant requires the `wasmtime` feature to be enabled")) + } + } else { + Err(format!("Unknown variant `{}`, known variants: {:?}", s, Self::variants())) + } } } impl WasmExecutionMethod { - /// Returns list of variants that are not disabled by feature flags. - pub fn enabled_variants() -> Vec<&'static str> { - Self::variants() - .iter() - .cloned() - .filter(|&name| cfg!(feature = "wasmtime") || name != "Compiled") - .collect() + /// Returns all the variants of this enum to be shown in the cli. + pub fn variants() -> &'static [&'static str] { + let variants = &["interpreted-i-know-what-i-do", "compiled"]; + if cfg!(feature = "wasmtime") { + variants + } else { + &variants[..1] + } } } @@ -181,7 +209,7 @@ impl std::str::FromStr for Database { } else if s.eq_ignore_ascii_case("paritydb-experimental") { Ok(Self::ParityDb) } else { - Err(format!("Unknwon variant `{}`, known variants: {:?}", s, Self::variants())) + Err(format!("Unknown variant `{}`, known variants: {:?}", s, Self::variants())) } } } diff --git a/client/cli/src/params/import_params.rs b/client/cli/src/params/import_params.rs index a1d8c1f8834c2..a62ec98a97029 100644 --- a/client/cli/src/params/import_params.rs +++ b/client/cli/src/params/import_params.rs @@ -27,6 +27,12 @@ use sc_client_api::execution_extensions::ExecutionStrategies; use structopt::StructOpt; use std::path::PathBuf; +#[cfg(feature = "wasmtime")] +const WASM_METHOD_DEFAULT: &str = "Compiled"; + +#[cfg(not(feature = "wasmtime"))] +const WASM_METHOD_DEFAULT: &str = "interpreted-i-know-what-i-do"; + /// Parameters for block import. #[derive(Debug, StructOpt, Clone)] pub struct ImportParams { @@ -50,9 +56,9 @@ pub struct ImportParams { #[structopt( long = "wasm-execution", value_name = "METHOD", - possible_values = &WasmExecutionMethod::enabled_variants(), + possible_values = &WasmExecutionMethod::variants(), case_insensitive = true, - default_value = "Interpreted" + default_value = WASM_METHOD_DEFAULT )] pub wasm_method: WasmExecutionMethod, @@ -76,7 +82,6 @@ pub struct ImportParams { } impl ImportParams { - /// Specify the state cache size. pub fn state_cache_size(&self) -> usize { self.state_cache_size diff --git a/utils/frame/benchmarking-cli/src/lib.rs b/utils/frame/benchmarking-cli/src/lib.rs index 9862a5a5b82a7..38dabd8c9415d 100644 --- a/utils/frame/benchmarking-cli/src/lib.rs +++ b/utils/frame/benchmarking-cli/src/lib.rs @@ -118,7 +118,7 @@ pub struct BenchmarkCmd { #[structopt( long = "wasm-execution", value_name = "METHOD", - possible_values = &WasmExecutionMethod::enabled_variants(), + possible_values = &WasmExecutionMethod::variants(), case_insensitive = true, default_value = "Interpreted" )] diff --git a/utils/frame/try-runtime/cli/src/lib.rs b/utils/frame/try-runtime/cli/src/lib.rs index 4d265c0995973..9e41a3fd87e77 100644 --- a/utils/frame/try-runtime/cli/src/lib.rs +++ b/utils/frame/try-runtime/cli/src/lib.rs @@ -51,7 +51,7 @@ pub struct TryRuntimeCmd { #[structopt( long = "wasm-execution", value_name = "METHOD", - possible_values = &WasmExecutionMethod::enabled_variants(), + possible_values = &WasmExecutionMethod::variants(), case_insensitive = true, default_value = "Interpreted" )]