mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 19:17:58 +00:00
Implement parameterisable modules (#1800)
* first implementation
* remove done comment
* origin done
* impl log for instance
* impl inherent for instance
* Fix wasm build + full example build
this requires parity codec implements codec for core::marker::PhantomData
* patch parity-codec link to github branch
* improve internal names and fix instance prefix
* Fix in macros
* add test modules for support
this allow to test for construct_runtime as well.
The reason to have put that in another crate is:
* if we put test in `tests/` dir of srml/support then decl_storage fails to get
srml-support access because it believes it is inside srml-support
crate and so derive access to `quote!{ crate }` but this is wrong
(and I don't see any way to prevent that, and it only bother us so I
don't think that matters that much)
* if we put test inside lib.rs then contruct_runtime cannot be used
because it call some macros that are defined with macros
(decl_outer_event and decl_outer_origin) and thus rustc complains.
* defaultinstance to its own struct to avoid errors
* enforce <T, I> for Event and Config, impl test
* add origin, log, inherent to test
* test more code generation
* basic storage test
* fix typo
* rename a few imports and field
* delete wip test in example and runtime
* change default prefix to make it backward compatible with test
* rename Instance to I and Instantiable to Instance
note: the name of generic parameter I is only enforce by decl_module!
and this could be rewritten
* doc
* clean old TODOs
* update parity-codec to 3.2
* update node impl version + builds
* fix warning
* fix unrelated grandpa test
* refactor code
This commit is contained in:
@@ -88,16 +88,48 @@ pub use srml_metadata::{EventMetadata, DecodeDifferent, OuterEventMetadata, FnEn
|
||||
/// ```
|
||||
///
|
||||
/// The syntax for generic events requires the `where`.
|
||||
///
|
||||
/// # Generic Event with Instance Example:
|
||||
///
|
||||
/// ```rust
|
||||
/// #[macro_use]
|
||||
/// extern crate srml_support;
|
||||
/// extern crate parity_codec as codec;
|
||||
/// #[macro_use]
|
||||
/// extern crate parity_codec;
|
||||
/// #[macro_use]
|
||||
/// extern crate serde_derive;
|
||||
///
|
||||
///# struct DefaultInstance;
|
||||
///# trait Instance {}
|
||||
///# impl Instance for DefaultInstance {}
|
||||
/// trait Trait<I: Instance=DefaultInstance> {
|
||||
/// type Balance;
|
||||
/// type Token;
|
||||
/// }
|
||||
///
|
||||
/// // For module with instances, DefaultInstance is optionnal
|
||||
/// decl_event!(
|
||||
/// pub enum Event<T, I: Instance = DefaultInstance> where
|
||||
/// <T as Trait>::Balance,
|
||||
/// <T as Trait>::Token
|
||||
/// {
|
||||
/// Message(Balance, Token),
|
||||
/// }
|
||||
/// );
|
||||
///# fn main() {}
|
||||
/// ```
|
||||
#[macro_export]
|
||||
macro_rules! decl_event {
|
||||
(
|
||||
$(#[$attr:meta])*
|
||||
pub enum Event<$evt_generic_param:ident> where
|
||||
pub enum Event<$evt_generic_param:ident $(, $instance:ident $(: $instantiable:ident)? $( = $event_default_instance:path)? )?> where
|
||||
$( $tt:tt )*
|
||||
) => {
|
||||
$crate::__decl_generic_event!(
|
||||
$( #[ $attr ] )*;
|
||||
$evt_generic_param;
|
||||
$($instance $( = $event_default_instance)? )?;
|
||||
{ $( $tt )* };
|
||||
);
|
||||
};
|
||||
@@ -138,11 +170,13 @@ macro_rules! __decl_generic_event {
|
||||
(
|
||||
$(#[$attr:meta])*;
|
||||
$event_generic_param:ident;
|
||||
$($instance:ident $( = $event_default_instance:path)? )?;
|
||||
{ $( $tt:tt )* };
|
||||
) => {
|
||||
$crate::__decl_generic_event!(@format_generic
|
||||
$( #[ $attr ] )*;
|
||||
$event_generic_param;
|
||||
$($instance $( = $event_default_instance)? )?;
|
||||
{ $( $tt )* };
|
||||
{};
|
||||
);
|
||||
@@ -151,12 +185,14 @@ macro_rules! __decl_generic_event {
|
||||
(@format_generic
|
||||
$(#[$attr:meta])*;
|
||||
$event_generic_param:ident;
|
||||
$($instance:ident $( = $event_default_instance:path)? )?;
|
||||
{ $generic_rename:ident = $generic_type:ty, $($rest:tt)* };
|
||||
{$( $parsed:tt)*};
|
||||
) => {
|
||||
$crate::__decl_generic_event!(@format_generic
|
||||
$( #[ $attr ] )*;
|
||||
$event_generic_param;
|
||||
$($instance $( = $event_default_instance)? )?;
|
||||
{ $($rest)* };
|
||||
{ $($parsed)*, $generic_rename = $generic_type };
|
||||
);
|
||||
@@ -165,12 +201,14 @@ macro_rules! __decl_generic_event {
|
||||
(@format_generic
|
||||
$(#[$attr:meta])*;
|
||||
$event_generic_param:ident;
|
||||
$($instance:ident $( = $event_default_instance:path)? )?;
|
||||
{ <$generic:ident as $trait:path>::$trait_type:ident, $($rest:tt)* };
|
||||
{$($parsed:tt)*};
|
||||
) => {
|
||||
$crate::__decl_generic_event!(@format_generic
|
||||
$( #[ $attr ] )*;
|
||||
$event_generic_param;
|
||||
$($instance $( = $event_default_instance)? )?;
|
||||
{ $($rest)* };
|
||||
{ $($parsed)*, $trait_type = <$generic as $trait>::$trait_type };
|
||||
);
|
||||
@@ -179,6 +217,7 @@ macro_rules! __decl_generic_event {
|
||||
(@format_generic
|
||||
$(#[$attr:meta])*;
|
||||
$event_generic_param:ident;
|
||||
$($instance:ident $( = $event_default_instance:path)? )?;
|
||||
{ $generic_type:ty, $($rest:tt)* };
|
||||
{$($parsed:tt)*};
|
||||
) => {
|
||||
@@ -188,12 +227,14 @@ macro_rules! __decl_generic_event {
|
||||
(@format_generic
|
||||
$(#[$attr:meta])*;
|
||||
$event_generic_param:ident;
|
||||
$($instance:ident $( = $event_default_instance:path)? )?;
|
||||
{ <$generic:ident as $trait:path>::$trait_type:ident { $( $events:tt )* } };
|
||||
{$( $parsed:tt)*};
|
||||
) => {
|
||||
$crate::__decl_generic_event!(@generate
|
||||
$( #[ $attr ] )*;
|
||||
$event_generic_param;
|
||||
$($instance $( = $event_default_instance)? )?;
|
||||
{ $($events)* };
|
||||
{ $($parsed)*, $trait_type = <$generic as $trait>::$trait_type};
|
||||
);
|
||||
@@ -202,12 +243,14 @@ macro_rules! __decl_generic_event {
|
||||
(@format_generic
|
||||
$(#[$attr:meta])*;
|
||||
$event_generic_param:ident;
|
||||
$($instance:ident $( = $event_default_instance:path)? )?;
|
||||
{ $generic_rename:ident = $generic_type:ty { $( $events:tt )* } };
|
||||
{$( $parsed:tt)*};
|
||||
) => {
|
||||
$crate::__decl_generic_event!(@generate
|
||||
$(#[$attr])*;
|
||||
$event_generic_param;
|
||||
$($instance $( = $event_default_instance)? )?;
|
||||
{ $($events)* };
|
||||
{ $($parsed)*, $generic_rename = $generic_type};
|
||||
);
|
||||
@@ -216,6 +259,7 @@ macro_rules! __decl_generic_event {
|
||||
(@format_generic
|
||||
$(#[$attr:meta])*;
|
||||
$event_generic_param:ident;
|
||||
$($instance:ident $( = $event_default_instance:path)? )?;
|
||||
{ $generic_type:ty { $( $events:tt )* } };
|
||||
{$( $parsed:tt)*};
|
||||
) => {
|
||||
@@ -224,6 +268,7 @@ macro_rules! __decl_generic_event {
|
||||
(@generate
|
||||
$(#[$attr:meta])*;
|
||||
$event_generic_param:ident;
|
||||
$($instance:ident $( = $event_default_instance:path)? )?;
|
||||
{ $( $events:tt )* };
|
||||
{ ,$( $generic_param:ident = $generic_type:ty ),* };
|
||||
) => {
|
||||
@@ -231,20 +276,22 @@ macro_rules! __decl_generic_event {
|
||||
///
|
||||
/// [`RawEvent`]: enum.RawEvent.html
|
||||
/// [`Trait`]: trait.Trait.html
|
||||
pub type Event<$event_generic_param> = RawEvent<$( $generic_type ),*>;
|
||||
pub type Event<$event_generic_param $(, $instance $( = $event_default_instance)? )?> = RawEvent<$( $generic_type ),* $(, $instance)? >;
|
||||
// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted.
|
||||
#[derive(Clone, PartialEq, Eq, $crate::codec::Encode, $crate::codec::Decode)]
|
||||
#[cfg_attr(feature = "std", derive(Debug))]
|
||||
$(#[$attr])*
|
||||
pub enum RawEvent<$( $generic_param ),*> {
|
||||
pub enum RawEvent<$( $generic_param ),* $(, $instance)? > {
|
||||
#[doc(hidden)]
|
||||
$(PhantomData($crate::rstd::marker::PhantomData<$instance>),)?
|
||||
$(
|
||||
$events
|
||||
)*
|
||||
}
|
||||
impl<$( $generic_param ),*> From<RawEvent<$( $generic_param ),*>> for () {
|
||||
fn from(_: RawEvent<$( $generic_param ),*>) -> () { () }
|
||||
impl<$( $generic_param ),* $(, $instance)? > From<RawEvent<$( $generic_param ),* $(, $instance)?>> for () {
|
||||
fn from(_: RawEvent<$( $generic_param ),* $(, $instance)?>) -> () { () }
|
||||
}
|
||||
impl<$( $generic_param ),*> RawEvent<$( $generic_param ),*> {
|
||||
impl<$( $generic_param ),* $(, $instance)?> RawEvent<$( $generic_param ),* $(, $instance)?> {
|
||||
#[allow(dead_code)]
|
||||
pub fn metadata() -> &'static [$crate::event::EventMetadata] {
|
||||
$crate::__events_to_metadata!(; $( $events )* )
|
||||
@@ -297,7 +344,7 @@ macro_rules! impl_outer_event {
|
||||
(
|
||||
$(#[$attr:meta])*
|
||||
pub enum $name:ident for $runtime:ident {
|
||||
$( $rest:tt $( <$t:ident> )*, )*
|
||||
$( $rest:tt $( <$t:ident $(, $rest_instance:path)? > )*, )*
|
||||
}
|
||||
) => {
|
||||
$crate::impl_outer_event!(
|
||||
@@ -305,14 +352,14 @@ macro_rules! impl_outer_event {
|
||||
$name;
|
||||
$runtime;
|
||||
system;
|
||||
Modules { $( $rest $(<$t>)*, )* };
|
||||
Modules { $( $rest $(<$t $(, $rest_instance)? >)*, )* };
|
||||
;
|
||||
);
|
||||
};
|
||||
(
|
||||
$(#[$attr:meta])*
|
||||
pub enum $name:ident for $runtime:ident where system = $system:ident {
|
||||
$( $rest:tt $( <$t:ident> )*, )*
|
||||
$( $rest:tt $( <$t:ident $(, $rest_instance:path)? > )*, )*
|
||||
}
|
||||
) => {
|
||||
$crate::impl_outer_event!(
|
||||
@@ -320,7 +367,7 @@ macro_rules! impl_outer_event {
|
||||
$name;
|
||||
$runtime;
|
||||
$system;
|
||||
Modules { $( $rest $(<$t>)*, )* };
|
||||
Modules { $( $rest $(<$t $(, $rest_instance)? >)*, )* };
|
||||
;
|
||||
);
|
||||
};
|
||||
@@ -330,18 +377,18 @@ macro_rules! impl_outer_event {
|
||||
$runtime:ident;
|
||||
$system:ident;
|
||||
Modules {
|
||||
$module:ident<T>,
|
||||
$( $rest:tt $( <$t:ident> )*, )*
|
||||
$module:ident<T $(, $instance:path)? >,
|
||||
$( $rest:tt $( <$t:ident $(, $rest_instance:path)? > )*, )*
|
||||
};
|
||||
$( $module_name:ident::Event $( <$generic_param:ident> )*, )*;
|
||||
$( $module_name:ident::Event $( <$generic_param:ident $(, $generic_instance:path)? > )*, )*;
|
||||
) => {
|
||||
$crate::impl_outer_event!(
|
||||
$( #[$attr] )*;
|
||||
$name;
|
||||
$runtime;
|
||||
$system;
|
||||
Modules { $( $rest $(<$t>)*, )* };
|
||||
$( $module_name::Event $( <$generic_param> )*, )* $module::Event<$runtime>,;
|
||||
Modules { $( $rest $(<$t $(, $rest_instance)? >)*, )* };
|
||||
$( $module_name::Event $( <$generic_param $(, $generic_instance)? > )*, )* $module::Event<$runtime $(, $instance)? >,;
|
||||
);
|
||||
};
|
||||
(
|
||||
@@ -351,17 +398,17 @@ macro_rules! impl_outer_event {
|
||||
$system:ident;
|
||||
Modules {
|
||||
$module:ident,
|
||||
$( $rest:tt, )*
|
||||
$( $rest:tt )*
|
||||
};
|
||||
$( $module_name:ident::Event $( <$generic_param:ident> )*, )*;
|
||||
$( $module_name:ident::Event $( <$generic_param:ident $(, $generic_instance:path)? > )*, )*;
|
||||
) => {
|
||||
$crate::impl_outer_event!(
|
||||
$( #[$attr] )*;
|
||||
$name;
|
||||
$runtime;
|
||||
$system;
|
||||
Modules { $( $rest, )* };
|
||||
$( $module_name::Event $( <$generic_param> )*, )* $module::Event,;
|
||||
Modules { $( $rest )* };
|
||||
$( $module_name::Event $( <$generic_param $(, $generic_instance)? > )*, )* $module::Event,;
|
||||
);
|
||||
};
|
||||
|
||||
@@ -373,7 +420,7 @@ macro_rules! impl_outer_event {
|
||||
$runtime:ident;
|
||||
$system:ident;
|
||||
Modules {};
|
||||
$( $module_name:ident::Event $( <$generic_param:ident> )*, )*;
|
||||
$( $module_name:ident::Event $( <$generic_param:ident $(, $generic_instance:path)? > )*, )*;
|
||||
) => {
|
||||
// Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted.
|
||||
#[derive(Clone, PartialEq, Eq, $crate::codec::Encode, $crate::codec::Decode)]
|
||||
@@ -383,7 +430,7 @@ macro_rules! impl_outer_event {
|
||||
pub enum $name {
|
||||
system($system::Event),
|
||||
$(
|
||||
$module_name( $module_name::Event $( <$generic_param> )* ),
|
||||
$module_name( $module_name::Event $( <$generic_param $(, $generic_instance)? > )* ),
|
||||
)*
|
||||
}
|
||||
impl From<$system::Event> for $name {
|
||||
@@ -392,8 +439,8 @@ macro_rules! impl_outer_event {
|
||||
}
|
||||
}
|
||||
$(
|
||||
impl From<$module_name::Event $( <$generic_param> )*> for $name {
|
||||
fn from(x: $module_name::Event $( <$generic_param> )*) -> Self {
|
||||
impl From<$module_name::Event $( <$generic_param $(, $generic_instance)? > )*> for $name {
|
||||
fn from(x: $module_name::Event $( <$generic_param $(, $generic_instance)? > )*) -> Self {
|
||||
$name::$module_name(x)
|
||||
}
|
||||
}
|
||||
@@ -402,7 +449,7 @@ macro_rules! impl_outer_event {
|
||||
$runtime;
|
||||
$name;
|
||||
$system;
|
||||
$( $module_name::Event $( <$generic_param> )*, )*;
|
||||
$( $module_name::Event $( <$generic_param $(, $generic_instance)? > )*, )*;
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -414,7 +461,7 @@ macro_rules! __impl_outer_event_json_metadata {
|
||||
$runtime:ident;
|
||||
$event_name:ident;
|
||||
$system:ident;
|
||||
$( $module_name:ident::Event $( <$generic_param:ident> )*, )*;
|
||||
$( $module_name:ident::Event $( <$generic_param:ident $(, $generic_instance:path)? > )*, )*;
|
||||
) => {
|
||||
impl $runtime {
|
||||
#[allow(dead_code)]
|
||||
@@ -427,7 +474,7 @@ macro_rules! __impl_outer_event_json_metadata {
|
||||
, (
|
||||
stringify!($module_name),
|
||||
$crate::event::FnEncode(
|
||||
$module_name::Event $( ::<$generic_param> )* ::metadata
|
||||
$module_name::Event $( ::<$generic_param $(, $generic_instance)? > )* ::metadata
|
||||
)
|
||||
)
|
||||
)*
|
||||
@@ -442,7 +489,7 @@ macro_rules! __impl_outer_event_json_metadata {
|
||||
#[allow(dead_code)]
|
||||
$crate::paste::item!{
|
||||
pub fn [< __module_events_ $module_name >] () -> &'static [$crate::event::EventMetadata] {
|
||||
$module_name::Event $( ::<$generic_param> )* ::metadata()
|
||||
$module_name::Event $( ::<$generic_param $(, $generic_instance)? > )* ::metadata()
|
||||
}
|
||||
}
|
||||
)*
|
||||
|
||||
Reference in New Issue
Block a user