mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-27 11:38:01 +00:00
Extend PalletInfoAccess with module_name and crate_version method (#9690)
* Record pallet indices in CallMetadata * Resurrect PalletVersion infrastructure and rename as CrateVersion * cargo fmt * Add missing runtime generics to pallet struct * Fix path to instance * Fix test * Fix UI test expectations * Fix UI test expectations * Move crate_version function to PalletInfoAccess * Update UI test expectations * Add crate_name method to PalletInfo * Convert path to module name instead of exposing crate name * cargo fmt * Keep the double colons when constructing the module name * Remove unused import * Update UI test expectations * Update frame/support/src/traits/metadata.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Update UI test expectations Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com>
This commit is contained in:
@@ -2151,6 +2151,18 @@ macro_rules! decl_module {
|
||||
.expect("Pallet is part of the runtime because pallet `Config` trait is \
|
||||
implemented by the runtime")
|
||||
}
|
||||
|
||||
fn module_name() -> &'static str {
|
||||
<
|
||||
<$trait_instance as $system::Config>::PalletInfo as $crate::traits::PalletInfo
|
||||
>::module_name::<Self>()
|
||||
.expect("Pallet is part of the runtime because pallet `Config` trait is \
|
||||
implemented by the runtime")
|
||||
}
|
||||
|
||||
fn crate_version() -> $crate::traits::CrateVersion {
|
||||
$crate::crate_to_crate_version!()
|
||||
}
|
||||
}
|
||||
|
||||
// Implement GetCallName for the Call.
|
||||
@@ -2529,8 +2541,8 @@ mod tests {
|
||||
use crate::{
|
||||
metadata::*,
|
||||
traits::{
|
||||
Get, GetCallName, IntegrityTest, OnFinalize, OnIdle, OnInitialize, OnRuntimeUpgrade,
|
||||
PalletInfo,
|
||||
CrateVersion, Get, GetCallName, IntegrityTest, OnFinalize, OnIdle, OnInitialize,
|
||||
OnRuntimeUpgrade, PalletInfo,
|
||||
},
|
||||
weights::{DispatchClass, DispatchInfo, Pays, RuntimeDbWeight},
|
||||
};
|
||||
@@ -2631,6 +2643,22 @@ mod tests {
|
||||
return Some("Test")
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
fn module_name<P: 'static>() -> Option<&'static str> {
|
||||
let type_id = sp_std::any::TypeId::of::<P>();
|
||||
if type_id == sp_std::any::TypeId::of::<Test>() {
|
||||
return Some("tests")
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
fn crate_version<P: 'static>() -> Option<CrateVersion> {
|
||||
let type_id = sp_std::any::TypeId::of::<P>();
|
||||
if type_id == sp_std::any::TypeId::of::<Test>() {
|
||||
return Some(frame_support::crate_to_crate_version!())
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
@@ -702,6 +702,21 @@ pub use frame_support_procedural::DefaultNoBound;
|
||||
/// ```
|
||||
pub use frame_support_procedural::require_transactional;
|
||||
|
||||
/// Convert the current crate version into a [`CrateVersion`](crate::traits::CrateVersion).
|
||||
///
|
||||
/// It uses the `CARGO_PKG_VERSION_MAJOR`, `CARGO_PKG_VERSION_MINOR` and
|
||||
/// `CARGO_PKG_VERSION_PATCH` environment variables to fetch the crate version.
|
||||
/// This means that the [`CrateVersion`](crate::traits::CrateVersion)
|
||||
/// object will correspond to the version of the crate the macro is called in!
|
||||
///
|
||||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// # use frame_support::{traits::CrateVersion, crate_to_crate_version};
|
||||
/// const Version: CrateVersion = crate_to_crate_version!();
|
||||
/// ```
|
||||
pub use frame_support_procedural::crate_to_crate_version;
|
||||
|
||||
/// Return Err of the expression: `return Err($expression);`.
|
||||
///
|
||||
/// Used as `fail!(expression)`.
|
||||
@@ -819,6 +834,7 @@ pub mod tests {
|
||||
StorageHasher,
|
||||
};
|
||||
use codec::{Codec, EncodeLike};
|
||||
use frame_support::traits::CrateVersion;
|
||||
use sp_io::TestExternalities;
|
||||
use sp_std::result;
|
||||
|
||||
@@ -832,6 +848,12 @@ pub mod tests {
|
||||
fn name<P: 'static>() -> Option<&'static str> {
|
||||
unimplemented!("PanicPalletInfo mustn't be triggered by tests");
|
||||
}
|
||||
fn module_name<P: 'static>() -> Option<&'static str> {
|
||||
unimplemented!("PanicPalletInfo mustn't be triggered by tests");
|
||||
}
|
||||
fn crate_version<P: 'static>() -> Option<CrateVersion> {
|
||||
unimplemented!("PanicPalletInfo mustn't be triggered by tests");
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Config: 'static {
|
||||
|
||||
@@ -62,8 +62,8 @@ pub use randomness::Randomness;
|
||||
|
||||
mod metadata;
|
||||
pub use metadata::{
|
||||
CallMetadata, GetCallMetadata, GetCallName, GetStorageVersion, PalletInfo, PalletInfoAccess,
|
||||
StorageVersion, STORAGE_VERSION_STORAGE_KEY_POSTFIX,
|
||||
CallMetadata, CrateVersion, GetCallMetadata, GetCallName, GetStorageVersion, PalletInfo,
|
||||
PalletInfoAccess, StorageVersion, STORAGE_VERSION_STORAGE_KEY_POSTFIX,
|
||||
};
|
||||
|
||||
mod hooks;
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
use codec::{Decode, Encode};
|
||||
use sp_runtime::RuntimeDebug;
|
||||
|
||||
/// Provides information about the pallet setup in the runtime.
|
||||
/// Provides information about the pallet itself and its setup in the runtime.
|
||||
///
|
||||
/// An implementor should be able to provide information about each pallet that
|
||||
/// is configured in `construct_runtime!`.
|
||||
@@ -29,16 +29,25 @@ pub trait PalletInfo {
|
||||
fn index<P: 'static>() -> Option<usize>;
|
||||
/// Convert the given pallet `P` into its name as configured in the runtime.
|
||||
fn name<P: 'static>() -> Option<&'static str>;
|
||||
/// Convert the given pallet `P` into its Rust module name as used in `construct_runtime!`.
|
||||
fn module_name<P: 'static>() -> Option<&'static str>;
|
||||
/// Convert the given pallet `P` into its containing crate version.
|
||||
fn crate_version<P: 'static>() -> Option<CrateVersion>;
|
||||
}
|
||||
|
||||
/// Provides information about the pallet setup in the runtime.
|
||||
/// Provides information about the pallet itself and its setup in the runtime.
|
||||
///
|
||||
/// Access the information provided by [`PalletInfo`] for a specific pallet.
|
||||
/// Declare some information and access the information provided by [`PalletInfo`] for a specific
|
||||
/// pallet.
|
||||
pub trait PalletInfoAccess {
|
||||
/// Index of the pallet as configured in the runtime.
|
||||
fn index() -> usize;
|
||||
/// Name of the pallet as configured in the runtime.
|
||||
fn name() -> &'static str;
|
||||
/// Name of the Rust module containing the pallet.
|
||||
fn module_name() -> &'static str;
|
||||
/// Version of the crate containing the pallet.
|
||||
fn crate_version() -> CrateVersion;
|
||||
}
|
||||
|
||||
/// The function and pallet name of the Call.
|
||||
@@ -68,6 +77,34 @@ pub trait GetCallMetadata {
|
||||
fn get_call_metadata(&self) -> CallMetadata;
|
||||
}
|
||||
|
||||
/// The version of a crate.
|
||||
#[derive(RuntimeDebug, Eq, PartialEq, Encode, Decode, Ord, Clone, Copy, Default)]
|
||||
pub struct CrateVersion {
|
||||
/// The major version of the crate.
|
||||
pub major: u16,
|
||||
/// The minor version of the crate.
|
||||
pub minor: u8,
|
||||
/// The patch version of the crate.
|
||||
pub patch: u8,
|
||||
}
|
||||
|
||||
impl CrateVersion {
|
||||
pub const fn new(major: u16, minor: u8, patch: u8) -> Self {
|
||||
Self { major, minor, patch }
|
||||
}
|
||||
}
|
||||
|
||||
impl sp_std::cmp::PartialOrd for CrateVersion {
|
||||
fn partial_cmp(&self, other: &Self) -> Option<sp_std::cmp::Ordering> {
|
||||
let res = self
|
||||
.major
|
||||
.cmp(&other.major)
|
||||
.then_with(|| self.minor.cmp(&other.minor).then_with(|| self.patch.cmp(&other.patch)));
|
||||
|
||||
Some(res)
|
||||
}
|
||||
}
|
||||
|
||||
/// The storage key postfix that is used to store the [`StorageVersion`] per pallet.
|
||||
///
|
||||
/// The full storage key is built by using:
|
||||
|
||||
Reference in New Issue
Block a user