Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Commit

Permalink
GetCallIndex trait (#13558)
Browse files Browse the repository at this point in the history
* GetCallIndex trait

* final impl

* ".git/.scripts/commands/fmt/fmt.sh"

* Docs

Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>

* One more test

Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>

* Doc

Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>

---------

Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
Co-authored-by: command-bot <>
Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
  • Loading branch information
kziemianek and ggwpez authored Mar 22, 2023
1 parent d6899f8 commit 8bd5741
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 8 deletions.
3 changes: 2 additions & 1 deletion frame/support/procedural/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -984,7 +984,8 @@ pub fn compact(_: TokenStream, _: TokenStream) -> TokenStream {
///
/// The macro creates an enum `Call` with one variant per dispatchable. This enum implements:
/// [`Clone`], [`Eq`], [`PartialEq`], [`Debug`] (with stripped implementation in `not("std")`),
/// `Encode`, `Decode`, `GetDispatchInfo`, `GetCallName`, and `UnfilteredDispatchable`.
/// `Encode`, `Decode`, `GetDispatchInfo`, `GetCallName`, `GetCallIndex` and
/// `UnfilteredDispatchable`.
///
/// The macro implements the `Callable` trait on `Pallet` and a function `call_functions`
/// which returns the dispatchable metadata.
Expand Down
15 changes: 15 additions & 0 deletions frame/support/procedural/src/pallet/expand/call.rs
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,21 @@ pub fn expand_call(def: &mut Def) -> proc_macro2::TokenStream {
}
}

impl<#type_impl_gen> #frame_support::dispatch::GetCallIndex for #call_ident<#type_use_gen>
#where_clause
{
fn get_call_index(&self) -> u8 {
match *self {
#( Self::#fn_name { .. } => #call_index, )*
Self::__Ignore(_, _) => unreachable!("__PhantomItem cannot be used."),
}
}

fn get_call_indices() -> &'static [u8] {
&[ #( #call_index, )* ]
}
}

impl<#type_impl_gen> #frame_support::traits::UnfilteredDispatchable
for #call_ident<#type_use_gen>
#where_clause
Expand Down
3 changes: 2 additions & 1 deletion frame/support/src/dispatch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ pub use crate::{
result,
},
traits::{
CallMetadata, GetCallMetadata, GetCallName, GetStorageVersion, UnfilteredDispatchable,
CallMetadata, GetCallIndex, GetCallMetadata, GetCallName, GetStorageVersion,
UnfilteredDispatchable,
},
};
#[cfg(feature = "std")]
Expand Down
4 changes: 2 additions & 2 deletions frame/support/src/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,8 @@ pub use randomness::Randomness;

mod metadata;
pub use metadata::{
CallMetadata, CrateVersion, GetCallMetadata, GetCallName, GetStorageVersion, PalletInfo,
PalletInfoAccess, PalletInfoData, PalletsInfoAccess, StorageVersion,
CallMetadata, CrateVersion, GetCallIndex, GetCallMetadata, GetCallName, GetStorageVersion,
PalletInfo, PalletInfoAccess, PalletInfoData, PalletsInfoAccess, StorageVersion,
STORAGE_VERSION_STORAGE_KEY_POSTFIX,
};

Expand Down
10 changes: 9 additions & 1 deletion frame/support/src/traits/metadata.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,20 @@ pub struct CallMetadata {

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

/// Gets the function index of the Call.
pub trait GetCallIndex {
/// Return all call indices in the same order as [`GetCallName`].
fn get_call_indices() -> &'static [u8];
/// Return the index of this Call.
fn get_call_index(&self) -> u8;
}

/// Gets the metadata for the Call - function name and pallet name.
pub trait GetCallMetadata {
/// Return all module names.
Expand Down
29 changes: 26 additions & 3 deletions frame/support/test/tests/pallet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ use frame_support::{
pallet_prelude::{StorageInfoTrait, ValueQuery},
storage::unhashed,
traits::{
ConstU32, GetCallName, GetStorageVersion, OnFinalize, OnGenesis, OnInitialize,
OnRuntimeUpgrade, PalletError, PalletInfoAccess, StorageVersion,
ConstU32, GetCallIndex, GetCallName, GetStorageVersion, OnFinalize, OnGenesis,
OnInitialize, OnRuntimeUpgrade, PalletError, PalletInfoAccess, StorageVersion,
},
weights::{RuntimeDbWeight, Weight},
};
Expand Down Expand Up @@ -231,6 +231,12 @@ pub mod pallet {
Ok(().into())
}

#[pallet::call_index(4)]
#[pallet::weight(1)]
pub fn foo_index_out_of_order(_origin: OriginFor<T>) -> DispatchResult {
Ok(())
}

// Test for DispatchResult return type
#[pallet::call_index(2)]
#[pallet::weight(1)]
Expand Down Expand Up @@ -728,8 +734,25 @@ fn call_expand() {
assert_eq!(call_foo.get_call_name(), "foo");
assert_eq!(
pallet::Call::<Runtime>::get_call_names(),
&["foo", "foo_storage_layer", "foo_no_post_info", "check_for_dispatch_context"],
&[
"foo",
"foo_storage_layer",
"foo_index_out_of_order",
"foo_no_post_info",
"check_for_dispatch_context"
],
);

assert_eq!(call_foo.get_call_index(), 0u8);
assert_eq!(pallet::Call::<Runtime>::get_call_indices(), &[0u8, 1u8, 4u8, 2u8, 3u8])
}

#[test]
fn call_expand_index() {
let call_foo = pallet::Call::<Runtime>::foo_index_out_of_order {};

assert_eq!(call_foo.get_call_index(), 4u8);
assert_eq!(pallet::Call::<Runtime>::get_call_indices(), &[0u8, 1u8, 4u8, 2u8, 3u8])
}

#[test]
Expand Down

0 comments on commit 8bd5741

Please sign in to comment.