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:
James Wilson
2023-03-31 16:56:19 +01:00
committed by GitHub
parent 42bcddeecb
commit a2b8dde5e6
132 changed files with 5810 additions and 5442 deletions
@@ -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);
}