From 6a6f3304128291e723fe7f15550671dedf71ad38 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bastian=20K=C3=B6cher?= <bkchr@users.noreply.github.com>
Date: Wed, 19 May 2021 10:29:32 +0200
Subject: [PATCH] Make wasmtime the default when the feature is enabled (#8855)

* Make wasmtime the default when the feature is enabled

* Update client/cli/src/arg_enums.rs

Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>

Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
---
 substrate/client/cli/src/arg_enums.rs         | 62 ++++++++++++++-----
 .../client/cli/src/params/import_params.rs    | 11 +++-
 .../utils/frame/benchmarking-cli/src/lib.rs   |  2 +-
 .../utils/frame/try-runtime/cli/src/lib.rs    |  2 +-
 4 files changed, 55 insertions(+), 22 deletions(-)

diff --git a/substrate/client/cli/src/arg_enums.rs b/substrate/client/cli/src/arg_enums.rs
index aeb3eeacc6f..fb2f8fdbc21 100644
--- a/substrate/client/cli/src/arg_enums.rs
+++ b/substrate/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<Self, String> {
+		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/substrate/client/cli/src/params/import_params.rs b/substrate/client/cli/src/params/import_params.rs
index a1d8c1f8834..a62ec98a970 100644
--- a/substrate/client/cli/src/params/import_params.rs
+++ b/substrate/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/substrate/utils/frame/benchmarking-cli/src/lib.rs b/substrate/utils/frame/benchmarking-cli/src/lib.rs
index 9862a5a5b82..38dabd8c941 100644
--- a/substrate/utils/frame/benchmarking-cli/src/lib.rs
+++ b/substrate/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/substrate/utils/frame/try-runtime/cli/src/lib.rs b/substrate/utils/frame/try-runtime/cli/src/lib.rs
index 4d265c09959..9e41a3fd87e 100644
--- a/substrate/utils/frame/try-runtime/cli/src/lib.rs
+++ b/substrate/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"
 	)]
-- 
GitLab