diff --git a/Cargo.lock b/Cargo.lock index 9be4a2b1e4..0548c11918 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5602,6 +5602,7 @@ dependencies = [ "pretty_assertions", "quote", "scale-info", + "scale-typegen", "scale-typegen-description", "scale-value", "serde", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 6b91fea425..47e8ddccee 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -27,6 +27,7 @@ chain-spec-pruning = ["smoldot"] [dependencies] subxt-codegen = { workspace = true } +scale-typegen = { workspace = true } subxt-utils-fetchmetadata = { workspace = true, features = ["url"] } subxt-utils-stripmetadata = { workspace = true } subxt-metadata = { workspace = true } diff --git a/cli/src/commands/codegen.rs b/cli/src/commands/codegen.rs index e7b8f070c5..10744aed76 100644 --- a/cli/src/commands/codegen.rs +++ b/cli/src/commands/codegen.rs @@ -210,8 +210,18 @@ fn codegen( codegen.no_docs() } - let metadata = subxt_metadata::Metadata::decode(&mut &*metadata_bytes) - .map_err(|e| eyre!("Cannot decode the provided metadata: {e}"))?; + let metadata = { + let mut metadata = subxt_metadata::Metadata::decode(&mut &*metadata_bytes) + .map_err(|e| eyre!("Cannot decode the provided metadata: {e}"))?; + + // Run this first to ensure type paths are unique (which may result in 1,2,3 suffixes being added + // to type paths), so that when we validate derives/substitutions below, they are allowed for such + // types. See . + scale_typegen::utils::ensure_unique_type_paths(metadata.types_mut()) + .expect("ensure_unique_type_paths should not fail; please report an issue."); + + metadata + }; // Configure derives: let global_derives = raw_derives diff --git a/macro/src/lib.rs b/macro/src/lib.rs index 355372f672..c3e00da1b9 100644 --- a/macro/src/lib.rs +++ b/macro/src/lib.rs @@ -102,7 +102,17 @@ fn subxt_inner(args: TokenStream, item_mod: syn::ItemMod) -> Result. + scale_typegen::utils::ensure_unique_type_paths(metadata.types_mut()) + .expect("ensure_unique_type_paths should not fail; please report an issue."); + + metadata + }; let mut codegen = CodegenBuilder::new(); @@ -135,6 +145,7 @@ fn subxt_inner(args: TokenStream, item_mod: syn::ItemMod) -> Result