polkadot_omni_node_lib/common/
chain_spec.rs1pub use sc_chain_spec::ChainSpec;
20use sc_chain_spec::ChainSpecExtension;
21use serde::{Deserialize, Serialize};
22use std::fmt::Debug;
23
24pub trait LoadSpec {
26 fn load_spec(&self, id: &str) -> Result<Box<dyn ChainSpec>, String>;
28}
29
30pub struct DiskChainSpecLoader;
32
33impl LoadSpec for DiskChainSpecLoader {
34 fn load_spec(&self, path: &str) -> Result<Box<dyn ChainSpec>, String> {
35 Ok(Box::new(GenericChainSpec::from_json_file(path.into())?))
36 }
37}
38
39#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, ChainSpecExtension)]
41pub struct Extensions {
42 #[serde(alias = "relayChain", alias = "RelayChain")]
46 relay_chain: String,
47 #[serde(alias = "paraId", alias = "ParaId")]
49 para_id: Option<u32>,
50}
51
52impl Extensions {
53 pub fn try_get(chain_spec: &dyn sc_service::ChainSpec) -> Option<&Self> {
55 sc_chain_spec::get_extension(chain_spec.extensions())
56 }
57
58 pub fn new_with_relay_chain(relay_chain: String) -> Self {
60 Extensions { relay_chain, para_id: None }
61 }
62
63 pub fn new(relay_chain: String, para_id: u32) -> Self {
65 Extensions { relay_chain, para_id: Some(para_id) }
66 }
67
68 pub fn para_id(&self) -> Option<u32> {
70 self.para_id
71 }
72
73 pub fn relay_chain(&self) -> String {
75 self.relay_chain.clone()
76 }
77}
78
79pub type GenericChainSpec = sc_service::GenericChainSpec<Extensions>;
81
82#[cfg(test)]
83mod tests {
84 use super::*;
85
86 #[test]
87 fn can_decode_extension_camel_and_snake_case() {
88 let camel_case = r#"{"relayChain":"relay","paraId":1}"#;
89 let snake_case = r#"{"relay_chain":"relay","para_id":1}"#;
90 let pascal_case = r#"{"RelayChain":"relay","ParaId":1}"#;
91 let para_id_missing = r#"{"RelayChain":"westend"}"#;
92
93 let camel_case_extension: Extensions = serde_json::from_str(camel_case).unwrap();
94 let snake_case_extension: Extensions = serde_json::from_str(snake_case).unwrap();
95 let pascal_case_extension: Extensions = serde_json::from_str(pascal_case).unwrap();
96 let missing_paraid_extension: Extensions = serde_json::from_str(para_id_missing).unwrap();
97 assert_eq!(camel_case_extension, snake_case_extension);
98 assert_eq!(snake_case_extension, pascal_case_extension);
99 assert_eq!(missing_paraid_extension.relay_chain, "westend".to_string());
100 assert!(missing_paraid_extension.para_id.is_none());
101 }
102}