mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-23 06:08:01 +00:00
Add --derive-for-type to cli (#708)
* Add `--derive-for-type` to cli * Remove clippy warnings
This commit is contained in:
committed by
GitHub
parent
702e87e58d
commit
a80d6cfd30
+31
-11
@@ -28,14 +28,27 @@ pub struct Opts {
|
||||
/// Additional derives
|
||||
#[clap(long = "derive")]
|
||||
derives: Vec<String>,
|
||||
/// Additional derives for a given type.
|
||||
///
|
||||
/// Example `--derive-for-type my_module::my_type=serde::Serialize`.
|
||||
#[clap(long = "derive-for-type", value_parser = derive_for_type_parser)]
|
||||
derives_for_type: Vec<(String, String)>,
|
||||
/// The `subxt` crate access path in the generated code.
|
||||
/// Defaults to `::subxt`.
|
||||
#[clap(long = "crate")]
|
||||
crate_path: Option<String>,
|
||||
}
|
||||
|
||||
fn derive_for_type_parser(src: &str) -> Result<(String, String), String> {
|
||||
let (ty, derive) = src
|
||||
.split_once('=')
|
||||
.ok_or_else(|| String::from("Invalid pattern for `derive-for-type`. It should be `type=derive`, like `my_type=serde::Serialize`"))?;
|
||||
|
||||
Ok((ty.to_string(), derive.to_string()))
|
||||
}
|
||||
|
||||
pub async fn run(opts: Opts) -> color_eyre::Result<()> {
|
||||
if let Some(file) = opts.file.as_ref() {
|
||||
let bytes = if let Some(file) = opts.file.as_ref() {
|
||||
if opts.url.is_some() {
|
||||
eyre::bail!("specify one of `--url` or `--file` but not both")
|
||||
};
|
||||
@@ -43,23 +56,24 @@ pub async fn run(opts: Opts) -> color_eyre::Result<()> {
|
||||
let mut file = fs::File::open(file)?;
|
||||
let mut bytes = Vec::new();
|
||||
file.read_to_end(&mut bytes)?;
|
||||
codegen(&bytes, opts.derives, opts.crate_path)?;
|
||||
return Ok(())
|
||||
}
|
||||
bytes
|
||||
} else {
|
||||
let url = opts.url.unwrap_or_else(|| {
|
||||
"http://localhost:9933"
|
||||
.parse::<Uri>()
|
||||
.expect("default url is valid")
|
||||
});
|
||||
subxt_codegen::utils::fetch_metadata_bytes(&url).await?
|
||||
};
|
||||
|
||||
let url = opts.url.unwrap_or_else(|| {
|
||||
"http://localhost:9933"
|
||||
.parse::<Uri>()
|
||||
.expect("default url is valid")
|
||||
});
|
||||
let bytes = subxt_codegen::utils::fetch_metadata_bytes(&url).await?;
|
||||
codegen(&bytes, opts.derives, opts.crate_path)?;
|
||||
codegen(&bytes, opts.derives, opts.derives_for_type, opts.crate_path)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn codegen(
|
||||
metadata_bytes: &[u8],
|
||||
raw_derives: Vec<String>,
|
||||
derives_for_type: Vec<(String, String)>,
|
||||
crate_path: Option<String>,
|
||||
) -> color_eyre::Result<()> {
|
||||
let item_mod = syn::parse_quote!(
|
||||
@@ -75,6 +89,12 @@ fn codegen(
|
||||
let mut derives = DerivesRegistry::new(&crate_path);
|
||||
derives.extend_for_all(p.into_iter());
|
||||
|
||||
for (ty, derive) in derives_for_type.into_iter() {
|
||||
let ty = syn::parse_str(&ty)?;
|
||||
let derive = syn::parse_str(&derive)?;
|
||||
derives.extend_for_type(ty, std::iter::once(derive), &crate_path)
|
||||
}
|
||||
|
||||
let runtime_api = subxt_codegen::generate_runtime_api_from_bytes(
|
||||
item_mod,
|
||||
metadata_bytes,
|
||||
|
||||
Reference in New Issue
Block a user