mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-22 21:58:00 +00:00
Add 'Static' type and improve type substitution codegen to accept it (#886)
* Add Static type which defers to Encode/Decode and impls EncodeAsType/DecodeAsType * rename to static_type and impl Deref/Mut * Improve type substitution in codegen so that concrete types can be swapped in * A couple of comment tweaks and no need for a macro export * Extend type substitution logic to work recursively on destination type * cargo fmt * Fix a couple of comments * update ui test outpuot * Add docs and missing_docs lint * Add test for replacing multiple of Ident * Update codegen/src/error.rs Co-authored-by: Niklas Adolfsson <niklasadolfsson1@gmail.com> * update copyright year and fix ui test * simplify another error --------- Co-authored-by: Niklas Adolfsson <niklasadolfsson1@gmail.com>
This commit is contained in:
+65
-5
@@ -1,7 +1,4 @@
|
||||
use core::marker::PhantomData;
|
||||
|
||||
use codec::{Decode, Encode};
|
||||
|
||||
use subxt::utils::AccountId32;
|
||||
|
||||
#[derive(Encode, Decode, subxt::ext::scale_encode::EncodeAsType, subxt::ext::scale_decode::DecodeAsType, Debug)]
|
||||
@@ -17,12 +14,16 @@ pub struct Generic<T>(T);
|
||||
#[derive(Encode, Decode, subxt::ext::scale_encode::EncodeAsType, subxt::ext::scale_decode::DecodeAsType, Debug)]
|
||||
#[encode_as_type(crate_path = "subxt::ext::scale_encode")]
|
||||
#[decode_as_type(crate_path = "subxt::ext::scale_decode")]
|
||||
pub struct Second<T, U>(U, PhantomData<T>);
|
||||
pub struct Second<T, U>(T, U);
|
||||
|
||||
#[derive(Encode, Decode, Debug)]
|
||||
pub struct DoesntImplEncodeDecodeAsType(u16);
|
||||
|
||||
#[subxt::subxt(
|
||||
runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale",
|
||||
substitute_type(
|
||||
type = "sp_runtime::multiaddress::MultiAddress<A, B>",
|
||||
// Discarding both params:
|
||||
with = "crate::CustomAddress"
|
||||
)
|
||||
)]
|
||||
@@ -32,6 +33,7 @@ pub mod node_runtime {}
|
||||
runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale",
|
||||
substitute_type(
|
||||
type = "sp_runtime::multiaddress::MultiAddress<A, B>",
|
||||
// Discarding second param:
|
||||
with = "crate::Generic<A>"
|
||||
)
|
||||
)]
|
||||
@@ -41,6 +43,7 @@ pub mod node_runtime2 {}
|
||||
runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale",
|
||||
substitute_type(
|
||||
type = "sp_runtime::multiaddress::MultiAddress<A, B>",
|
||||
// Discarding first param:
|
||||
with = "crate::Generic<B>"
|
||||
)
|
||||
)]
|
||||
@@ -50,11 +53,52 @@ pub mod node_runtime3 {}
|
||||
runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale",
|
||||
substitute_type(
|
||||
type = "sp_runtime::multiaddress::MultiAddress<A, B>",
|
||||
// Swapping params:
|
||||
with = "crate::Second<B, A>"
|
||||
)
|
||||
)]
|
||||
pub mod node_runtime4 {}
|
||||
|
||||
#[subxt::subxt(
|
||||
runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale",
|
||||
substitute_type(
|
||||
type = "sp_runtime::multiaddress::MultiAddress",
|
||||
// Ignore input params and just use concrete types on output:
|
||||
with = "crate::Second<bool, ::std::vec::Vec<u8>>"
|
||||
)
|
||||
)]
|
||||
pub mod node_runtime5 {}
|
||||
|
||||
#[subxt::subxt(
|
||||
runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale",
|
||||
substitute_type(
|
||||
type = "sp_runtime::multiaddress::MultiAddress<A, B>",
|
||||
// We can put a static type in, too:
|
||||
with = "crate::Second<B, u16>"
|
||||
)
|
||||
)]
|
||||
pub mod node_runtime6 {}
|
||||
|
||||
#[subxt::subxt(
|
||||
runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale",
|
||||
substitute_type(
|
||||
type = "sp_runtime::multiaddress::MultiAddress<A, B>",
|
||||
// Check that things can be wrapped in our Static type:
|
||||
with = "::subxt::utils::Static<crate::DoesntImplEncodeDecodeAsType>"
|
||||
)
|
||||
)]
|
||||
pub mod node_runtime7 {}
|
||||
|
||||
#[subxt::subxt(
|
||||
runtime_metadata_path = "../../../../artifacts/polkadot_metadata.scale",
|
||||
substitute_type(
|
||||
type = "sp_runtime::multiaddress::MultiAddress<A, B>",
|
||||
// Recursive type param substitution should work too (swapping out nested A and B):
|
||||
with = "::subxt::utils::Static<crate::Second<A, B>>"
|
||||
)
|
||||
)]
|
||||
pub mod node_runtime8 {}
|
||||
|
||||
fn main() {
|
||||
// We assume Polkadot's config of MultiAddress<AccountId32, ()> here
|
||||
let _ = node_runtime::tx()
|
||||
@@ -71,5 +115,21 @@ fn main() {
|
||||
|
||||
let _ = node_runtime4::tx()
|
||||
.balances()
|
||||
.transfer(Second(AccountId32::from([0x01;32]), PhantomData), 123);
|
||||
.transfer(Second((), AccountId32::from([0x01;32])), 123);
|
||||
|
||||
let _ = node_runtime5::tx()
|
||||
.balances()
|
||||
.transfer(Second(true, vec![1u8, 2u8]), 123);
|
||||
|
||||
let _ = node_runtime6::tx()
|
||||
.balances()
|
||||
.transfer(Second((), 1234u16), 123);
|
||||
|
||||
let _ = node_runtime7::tx()
|
||||
.balances()
|
||||
.transfer(subxt::utils::Static(DoesntImplEncodeDecodeAsType(1337)), 123);
|
||||
|
||||
let _ = node_runtime8::tx()
|
||||
.balances()
|
||||
.transfer(subxt::utils::Static(Second(AccountId32::from([0x01;32]), ())), 123);
|
||||
}
|
||||
Reference in New Issue
Block a user