macro_rules! parameter_types {
    (
		$( #[ $attr:meta ] )*
		$vis:vis const $name:ident $(< $($ty_params:ident),* >)?: $type:ty = $value:expr;
		$( $rest:tt )*
	) => { ... };
    (
		$( #[ $attr:meta ] )*
		$vis:vis $name:ident $(< $($ty_params:ident),* >)?: $type:ty = $value:expr;
		$( $rest:tt )*
	) => { ... };
    (
		$( #[ $attr:meta ] )*
		$vis:vis storage $name:ident $(< $($ty_params:ident),* >)?: $type:ty = $value:expr;
		$( $rest:tt )*
	) => { ... };
    () => { ... };
    (IMPL_CONST $name:ident, $type:ty, $value:expr $(, $ty_params:ident)*) => { ... };
    (IMPL $name:ident, $type:ty, $value:expr $(, $ty_params:ident)*) => { ... };
    (IMPL_STORAGE $name:ident, $type:ty, $value:expr $(, $ty_params:ident)*) => { ... };
    (
		$( #[ $attr:meta ] )*
		$vis:vis static $name:ident: $type:ty = $value:expr;
		$( $rest:tt )*
	) => { ... };
}
Expand description

Create new implementations of the Get trait.

The so-called parameter type can be created in four different ways:

  • Using const to create a parameter type that provides a const getter. It is required that the value is const.

  • Declare the parameter type without const to have more freedom when creating the value.

  • Using storage to create a storage parameter type. This type is special as it tries to load the value from the storage under a fixed key. If the value could not be found in the storage, the given default value will be returned. It is required that the value implements Encode and Decode. The key for looking up the value in the storage is built using the following formula:

    twox_128(":" ++ NAME ++ ":") where NAME is the name that is passed as type name.

  • Using static to create a static parameter type. Its value is being provided by a static variable with the equivalent name in UPPER_SNAKE_CASE. An additional set function is provided in this case to alter the static variable. This is intended for testing ONLY and is ONLY available when std is enabled.

§Examples

// This function cannot be used in a const context.
fn non_const_expression() -> u64 { 99 }

const FIXED_VALUE: u64 = 10;
parameter_types! {
   pub const Argument: u64 = 42 + FIXED_VALUE;
   /// Visibility of the type is optional
   OtherArgument: u64 = non_const_expression();
   pub storage StorageArgument: u64 = 5;
   pub static StaticArgument: u32 = 7;
}

trait Config {
   type Parameter: Get<u64>;
   type OtherParameter: Get<u64>;
   type StorageParameter: Get<u64>;
   type StaticParameter: Get<u32>;
}

struct Runtime;
impl Config for Runtime {
   type Parameter = Argument;
   type OtherParameter = OtherArgument;
   type StorageParameter = StorageArgument;
   type StaticParameter = StaticArgument;
}

// In testing, `StaticArgument` can be altered later: `StaticArgument::set(8)`.

§Invalid example:

// This function cannot be used in a const context.
fn non_const_expression() -> u64 { 99 }

parameter_types! {
   pub const Argument: u64 = non_const_expression();
}