Skip to content

Commit

Permalink
Add trait to get module and call names. (paritytech#4854)
Browse files Browse the repository at this point in the history
* Add trait to get module and call names.


Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
  • Loading branch information
marcio-diaz and bkchr committed Feb 10, 2020
1 parent d472cd6 commit b388338
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 1 deletion.
2 changes: 1 addition & 1 deletion bin/node/runtime/src/lib.rs
Expand Up @@ -82,7 +82,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
// implementation changes and behavior does not, then leave spec_version as
// is and increment impl_version.
spec_version: 215,
impl_version: 0,
impl_version: 1,
apis: RUNTIME_API_VERSIONS,
};

Expand Down
38 changes: 38 additions & 0 deletions frame/support/src/dispatch.rs
Expand Up @@ -1346,6 +1346,14 @@ macro_rules! decl_module {
$call_type::__PhantomItem(_, _) => unreachable!("__PhantomItem should never be used."),
}
}

fn get_call_names() -> &'static [&'static str] {
&[
$(
stringify!($fn_name),
)*
]
}
}

// manual implementation of clone/eq/partialeq because using derive erroneously requires
Expand Down Expand Up @@ -1518,6 +1526,24 @@ macro_rules! impl_outer_dispatch {
}, )*
}
}

fn get_module_names() -> &'static [&'static str] {
&[$(
stringify!($camelcase),
)*]
}

fn get_call_names(module: &str) -> &'static [&'static str] {
use $crate::dispatch::{Callable, GetCallName};
match module {
$(
stringify!($camelcase) =>
<<$camelcase as Callable<$runtime>>::Call
as GetCallName>::get_call_names(),
)*
_ => unreachable!(),
}
}
}
impl $crate::dispatch::Dispatchable for $call_type {
type Origin = $origin;
Expand Down Expand Up @@ -2118,4 +2144,16 @@ mod tests {
let expected = CallMetadata { function_name: "aux_3".into(), pallet_name: "Test".into() };
assert_eq!(metadata, expected);
}

#[test]
fn get_call_names() {
let call_names = Call::<TraitImpl>::get_call_names();
assert_eq!(["aux_0", "aux_1", "aux_2", "aux_3", "aux_4", "aux_5", "operational"], call_names);
}

#[test]
fn get_module_names() {
let module_names = OuterCall::get_module_names();
assert_eq!(["Test"], module_names);
}
}
6 changes: 6 additions & 0 deletions frame/support/src/traits.rs
Expand Up @@ -819,12 +819,18 @@ pub struct CallMetadata {

/// Gets the function name of the Call.
pub trait GetCallName {
/// Return all function names.
fn get_call_names() -> &'static [&'static str];
/// Return the function name of the Call.
fn get_call_name(&self) -> &'static str;
}

/// Gets the metadata for the Call - function name and pallet name.
pub trait GetCallMetadata {
/// Return all module names.
fn get_module_names() -> &'static [&'static str];
/// Return all function names for the given `module`.
fn get_call_names(module: &str) -> &'static [&'static str];
/// Return a [`CallMetadata`], containing function and pallet name of the Call.
fn get_call_metadata(&self) -> CallMetadata;
}

0 comments on commit b388338

Please sign in to comment.