mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-03 11:07:25 +00:00
Allow to specify some max number of values for storages in pallet macro. (#8735)
* implement max_values + storages info * some formatting + doc * rename StoragesInfo -> PalletStorageInfo * merge both StorageInfoTrait and PalletStorageInfo I think it is more future proof. In the future some storage could make use of multiple prefix. Like one to store how much value has been inserted, etc... * Update frame/support/procedural/src/storage/parse.rs Co-authored-by: Peter Goodspeed-Niklaus <coriolinus@users.noreply.github.com> * Update frame/support/procedural/src/storage/storage_struct.rs Co-authored-by: Peter Goodspeed-Niklaus <coriolinus@users.noreply.github.com> * Fix max_size using hasher information hasher now expose `max_len` which allows to computes their maximum len. For hasher without concatenation, it is the size of the hash part, for hasher with concatenation, it is the size of the hash part + max encoded len of the key. * fix tests * fix ui tests Co-authored-by: Peter Goodspeed-Niklaus <coriolinus@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
59f34ab8bc
commit
9bf62ef65d
@@ -21,10 +21,12 @@ use frame_support_procedural_tools::{ToTokens, Parse, syn_ext as ext};
|
||||
use syn::{Ident, Token, spanned::Spanned};
|
||||
|
||||
mod keyword {
|
||||
syn::custom_keyword!(generate_storage_info);
|
||||
syn::custom_keyword!(hiddencrate);
|
||||
syn::custom_keyword!(add_extra_genesis);
|
||||
syn::custom_keyword!(extra_genesis_skip_phantom_data_field);
|
||||
syn::custom_keyword!(config);
|
||||
syn::custom_keyword!(max_values);
|
||||
syn::custom_keyword!(build);
|
||||
syn::custom_keyword!(get);
|
||||
syn::custom_keyword!(map);
|
||||
@@ -73,6 +75,7 @@ macro_rules! impl_parse_for_opt {
|
||||
/// Parsing usage only
|
||||
#[derive(Parse, ToTokens, Debug)]
|
||||
struct StorageDefinition {
|
||||
pub generate_storage_info: Opt<GenerateStorageInfo>,
|
||||
pub hidden_crate: Opt<SpecificHiddenCrate>,
|
||||
pub visibility: syn::Visibility,
|
||||
pub trait_token: Token![trait],
|
||||
@@ -97,6 +100,12 @@ struct StorageDefinition {
|
||||
pub extra_genesis: Opt<AddExtraGenesis>,
|
||||
}
|
||||
|
||||
#[derive(Parse, ToTokens, Debug)]
|
||||
struct GenerateStorageInfo {
|
||||
pub keyword: keyword::generate_storage_info,
|
||||
}
|
||||
impl_parse_for_opt!(GenerateStorageInfo => keyword::generate_storage_info);
|
||||
|
||||
#[derive(Parse, ToTokens, Debug)]
|
||||
struct SpecificHiddenCrate {
|
||||
pub keyword: keyword::hiddencrate,
|
||||
@@ -160,6 +169,7 @@ struct DeclStorageLine {
|
||||
pub name: Ident,
|
||||
pub getter: Opt<DeclStorageGetter>,
|
||||
pub config: Opt<DeclStorageConfig>,
|
||||
pub max_values: Opt<DeclStorageMaxValues>,
|
||||
pub build: Opt<DeclStorageBuild>,
|
||||
pub coldot_token: Token![:],
|
||||
pub storage_type: DeclStorageType,
|
||||
@@ -188,6 +198,13 @@ struct DeclStorageConfig {
|
||||
|
||||
impl_parse_for_opt!(DeclStorageConfig => keyword::config);
|
||||
|
||||
#[derive(Parse, ToTokens, Debug)]
|
||||
struct DeclStorageMaxValues {
|
||||
pub max_values_keyword: keyword::max_values,
|
||||
pub expr: ext::Parens<syn::Expr>,
|
||||
}
|
||||
impl_parse_for_opt!(DeclStorageMaxValues => keyword::max_values);
|
||||
|
||||
#[derive(Parse, ToTokens, Debug)]
|
||||
struct DeclStorageBuild {
|
||||
pub build_keyword: keyword::build,
|
||||
@@ -437,6 +454,7 @@ pub fn parse(input: syn::parse::ParseStream) -> syn::Result<super::DeclStorageDe
|
||||
let storage_lines = parse_storage_line_defs(def.content.content.inner.into_iter())?;
|
||||
|
||||
Ok(super::DeclStorageDef {
|
||||
generate_storage_info: def.generate_storage_info.inner.is_some(),
|
||||
hidden_crate: def.hidden_crate.inner.map(|i| i.ident.content),
|
||||
visibility: def.visibility,
|
||||
module_name: def.module_ident,
|
||||
@@ -490,6 +508,21 @@ fn parse_storage_line_defs(
|
||||
})?;
|
||||
}
|
||||
|
||||
let max_values = match &line.storage_type {
|
||||
DeclStorageType::Map(_) | DeclStorageType::DoubleMap(_) | DeclStorageType::NMap(_) => {
|
||||
line.max_values.inner.map(|i| i.expr.content)
|
||||
},
|
||||
DeclStorageType::Simple(_) => {
|
||||
if let Some(max_values) = line.max_values.inner {
|
||||
let msg = "unexpected max_values attribute for storage value.";
|
||||
let span = max_values.max_values_keyword.span();
|
||||
return Err(syn::Error::new(span, msg));
|
||||
} else {
|
||||
Some(syn::parse_quote!(1u32))
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
let span = line.storage_type.span();
|
||||
let no_hasher_error = || syn::Error::new(
|
||||
span,
|
||||
@@ -534,6 +567,7 @@ fn parse_storage_line_defs(
|
||||
name: line.name,
|
||||
getter,
|
||||
config,
|
||||
max_values,
|
||||
build: line.build.inner.map(|o| o.expr.content),
|
||||
default_value: line.default_value.inner.map(|o| o.expr),
|
||||
storage_type,
|
||||
|
||||
Reference in New Issue
Block a user