diff --git a/substrate/core/service/src/chain_spec.rs b/substrate/core/service/src/chain_spec.rs index 461d24e188..ca92a4814c 100644 --- a/substrate/core/service/src/chain_spec.rs +++ b/substrate/core/service/src/chain_spec.rs @@ -16,6 +16,7 @@ //! Substrate chain configurations. +use std::borrow::Cow; use std::collections::HashMap; use std::fs::File; use std::path::PathBuf; @@ -29,7 +30,7 @@ use tel::TelemetryEndpoints; enum GenesisSource { File(PathBuf), - Embedded(&'static [u8]), + Binary(Cow<'static, [u8]>), Factory(fn() -> G), } @@ -37,7 +38,7 @@ impl Clone for GenesisSource { fn clone(&self) -> Self { match *self { GenesisSource::File(ref path) => GenesisSource::File(path.clone()), - GenesisSource::Embedded(d) => GenesisSource::Embedded(d), + GenesisSource::Binary(ref d) => GenesisSource::Binary(d.clone()), GenesisSource::Factory(f) => GenesisSource::Factory(f), } } @@ -50,14 +51,16 @@ impl GenesisSource { genesis: Genesis, } - match *self { - GenesisSource::File(ref path) => { + match self { + GenesisSource::File(path) => { let file = File::open(path).map_err(|e| format!("Error opening spec file: {}", e))?; - let genesis: GenesisContainer = json::from_reader(file).map_err(|e| format!("Error parsing spec file: {}", e))?; + let genesis: GenesisContainer = + json::from_reader(file).map_err(|e| format!("Error parsing spec file: {}", e))?; Ok(genesis.genesis) }, - GenesisSource::Embedded(buf) => { - let genesis: GenesisContainer = json::from_reader(buf).map_err(|e| format!("Error parsing embedded file: {}", e))?; + GenesisSource::Binary(buf) => { + let genesis: GenesisContainer = + json::from_reader(buf.as_ref()).map_err(|e| format!("Error parsing embedded file: {}", e))?; Ok(genesis.genesis) }, GenesisSource::Factory(f) => Ok(Genesis::Runtime(f())), @@ -158,11 +161,12 @@ impl ChainSpec { } /// Parse json content into a `ChainSpec` - pub fn from_embedded(json: &'static [u8]) -> Result { - let spec = json::from_slice(json).map_err(|e| format!("Error parsing spec file: {}", e))?; + pub fn from_json_bytes(json: impl Into>) -> Result { + let json = json.into(); + let spec = json::from_slice(json.as_ref()).map_err(|e| format!("Error parsing spec file: {}", e))?; Ok(ChainSpec { spec, - genesis: GenesisSource::Embedded(json), + genesis: GenesisSource::Binary(json), }) } diff --git a/substrate/node/cli/src/chain_spec.rs b/substrate/node/cli/src/chain_spec.rs index 26e54f6ee6..d2fd0cfbc5 100644 --- a/substrate/node/cli/src/chain_spec.rs +++ b/substrate/node/cli/src/chain_spec.rs @@ -39,7 +39,7 @@ pub type ChainSpec = substrate_service::ChainSpec; /// Flaming Fir testnet generator pub fn flaming_fir_config() -> Result { - ChainSpec::from_embedded(include_bytes!("../res/flaming-fir.json")) + ChainSpec::from_json_bytes(&include_bytes!("../res/flaming-fir.json")[..]) } fn session_keys(ed_key: ed25519::Public, sr_key: sr25519::Public) -> SessionKeys {