From 7c1ab73ad8d9eb39bf7a20157a7bfee3dcfac549 Mon Sep 17 00:00:00 2001 From: fewensa Date: Tue, 25 Jan 2022 18:51:05 +0800 Subject: [PATCH 1/5] Custom derive for cli --- cli/src/main.rs | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index 7f25ddceee..8199306696 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -33,6 +33,12 @@ use std::{ path::PathBuf, }; use structopt::StructOpt; +use subxt_codegen::GeneratedTypeDerives; +use syn::{ + punctuated::Punctuated, + Ident, + __private::Span, +}; /// Utilities for working with substrate metadata for subxt. #[derive(Debug, StructOpt)] @@ -70,6 +76,9 @@ enum Command { /// the path to the encoded metadata file. #[structopt(short, long, parse(from_os_str))] file: Option, + /// Additional derives + #[structopt(long = "derive")] + derives: Vec, }, } @@ -102,7 +111,7 @@ fn main() -> color_eyre::Result<()> { } } } - Command::Codegen { url, file } => { + Command::Codegen { url, file, derives } => { if let Some(file) = file.as_ref() { if url.is_some() { eyre::bail!("specify one of `--url` or `--file` but not both") @@ -111,7 +120,7 @@ fn main() -> color_eyre::Result<()> { let mut file = fs::File::open(file)?; let mut bytes = Vec::new(); file.read_to_end(&mut bytes)?; - codegen(&mut &bytes[..])?; + codegen(&mut &bytes[..], derives)?; return Ok(()) } @@ -119,7 +128,7 @@ fn main() -> color_eyre::Result<()> { url::Url::parse("http://localhost:9933").expect("default url is valid") }); let (_, bytes) = fetch_metadata(&url)?; - codegen(&mut &bytes[..])?; + codegen(&mut &bytes[..], derives)?; Ok(()) } } @@ -145,13 +154,24 @@ fn fetch_metadata(url: &url::Url) -> color_eyre::Result<(String, Vec)> { Ok((hex_data, bytes)) } -fn codegen(encoded: &mut I) -> color_eyre::Result<()> { +fn codegen( + encoded: &mut I, + raw_derives: Vec, +) -> color_eyre::Result<()> { let metadata = ::decode(encoded)?; let generator = subxt_codegen::RuntimeGenerator::new(metadata); let item_mod = syn::parse_quote!( pub mod api {} ); - let runtime_api = generator.generate_runtime(item_mod, Default::default()); + + let mut derives = GeneratedTypeDerives::default(); + for raw in raw_derives { + let mut p: Punctuated = Punctuated::new(); + p.push(Ident::new(&raw, Span::call_site()).into()); + derives.append(p.iter().cloned()); + } + + let runtime_api = generator.generate_runtime(item_mod, derives); println!("{}", runtime_api); Ok(()) } From 788a1409f7e379c1c0605abaf8c92a69feb2bcfd Mon Sep 17 00:00:00 2001 From: fewensa Date: Tue, 25 Jan 2022 19:08:40 +0800 Subject: [PATCH 2/5] Better than better --- cli/src/main.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index 8199306696..3ee8ad03b1 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -164,12 +164,12 @@ fn codegen( pub mod api {} ); - let mut derives = GeneratedTypeDerives::default(); + let mut p: Punctuated = Punctuated::new(); for raw in raw_derives { - let mut p: Punctuated = Punctuated::new(); p.push(Ident::new(&raw, Span::call_site()).into()); - derives.append(p.iter().cloned()); } + let mut derives = GeneratedTypeDerives::default(); + derives.append(p.iter().cloned()); let runtime_api = generator.generate_runtime(item_mod, derives); println!("{}", runtime_api); From 1a716f4f027c42bb13467e8a75a10749d7dac95a Mon Sep 17 00:00:00 2001 From: fewensa Date: Tue, 25 Jan 2022 20:02:59 +0800 Subject: [PATCH 3/5] Simplify code --- cli/src/main.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index 3ee8ad03b1..fbf9d9e835 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -35,7 +35,6 @@ use std::{ use structopt::StructOpt; use subxt_codegen::GeneratedTypeDerives; use syn::{ - punctuated::Punctuated, Ident, __private::Span, }; @@ -164,7 +163,7 @@ fn codegen( pub mod api {} ); - let mut p: Punctuated = Punctuated::new(); + let mut p = Vec::::new(); for raw in raw_derives { p.push(Ident::new(&raw, Span::call_site()).into()); } From 2687140ef700154de59f0c0dff61f80df1afaa62 Mon Sep 17 00:00:00 2001 From: fewensa Date: Thu, 27 Jan 2022 11:31:48 +0800 Subject: [PATCH 4/5] Simplify code --- cli/src/main.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index fbf9d9e835..2c6fdede93 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -163,10 +163,10 @@ fn codegen( pub mod api {} ); - let mut p = Vec::::new(); - for raw in raw_derives { - p.push(Ident::new(&raw, Span::call_site()).into()); - } + let p: Vec = raw_derives + .iter() + .map(|raw| Ident::new(&raw, Span::call_site()).into()) + .collect(); let mut derives = GeneratedTypeDerives::default(); derives.append(p.iter().cloned()); From 7471163965803b96d3cfd4fd8b091e9db602db0b Mon Sep 17 00:00:00 2001 From: fewensa Date: Thu, 27 Jan 2022 21:12:56 +0800 Subject: [PATCH 5/5] Change follow suggestions --- cli/src/main.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index 2c6fdede93..14a5f2949a 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -34,10 +34,6 @@ use std::{ }; use structopt::StructOpt; use subxt_codegen::GeneratedTypeDerives; -use syn::{ - Ident, - __private::Span, -}; /// Utilities for working with substrate metadata for subxt. #[derive(Debug, StructOpt)] @@ -163,12 +159,12 @@ fn codegen( pub mod api {} ); - let p: Vec = raw_derives + let p = raw_derives .iter() - .map(|raw| Ident::new(&raw, Span::call_site()).into()) - .collect(); + .map(|raw| syn::parse_str(&raw)) + .collect::, _>>()?; let mut derives = GeneratedTypeDerives::default(); - derives.append(p.iter().cloned()); + derives.append(p.into_iter()); let runtime_api = generator.generate_runtime(item_mod, derives); println!("{}", runtime_api);