mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-01 04:17:57 +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
@@ -24,6 +24,7 @@ mod keyword {
|
||||
syn::custom_keyword!(pallet);
|
||||
syn::custom_keyword!(Pallet);
|
||||
syn::custom_keyword!(generate_store);
|
||||
syn::custom_keyword!(generate_storage_info);
|
||||
syn::custom_keyword!(Store);
|
||||
}
|
||||
|
||||
@@ -39,12 +40,30 @@ pub struct PalletStructDef {
|
||||
pub store: Option<(syn::Visibility, keyword::Store)>,
|
||||
/// The span of the pallet::pallet attribute.
|
||||
pub attr_span: proc_macro2::Span,
|
||||
/// Whether to specify the storages max encoded len when implementing `StorageInfoTrait`.
|
||||
/// Contains the span of the attribute.
|
||||
pub generate_storage_info: Option<proc_macro2::Span>,
|
||||
}
|
||||
|
||||
/// Parse for `#[pallet::generate_store($vis trait Store)]`
|
||||
pub struct PalletStructAttr {
|
||||
vis: syn::Visibility,
|
||||
keyword: keyword::Store,
|
||||
/// Parse for one variant of:
|
||||
/// * `#[pallet::generate_store($vis trait Store)]`
|
||||
/// * `#[pallet::generate_storage_info]`
|
||||
pub enum PalletStructAttr {
|
||||
GenerateStore {
|
||||
span: proc_macro2::Span,
|
||||
vis: syn::Visibility,
|
||||
keyword: keyword::Store,
|
||||
},
|
||||
GenerateStorageInfoTrait(proc_macro2::Span),
|
||||
}
|
||||
|
||||
impl PalletStructAttr {
|
||||
fn span(&self) -> proc_macro2::Span {
|
||||
match self {
|
||||
Self::GenerateStore { span, .. } => *span,
|
||||
Self::GenerateStorageInfoTrait(span) => *span,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl syn::parse::Parse for PalletStructAttr {
|
||||
@@ -54,14 +73,23 @@ impl syn::parse::Parse for PalletStructAttr {
|
||||
syn::bracketed!(content in input);
|
||||
content.parse::<keyword::pallet>()?;
|
||||
content.parse::<syn::Token![::]>()?;
|
||||
content.parse::<keyword::generate_store>()?;
|
||||
|
||||
let generate_content;
|
||||
syn::parenthesized!(generate_content in content);
|
||||
let vis = generate_content.parse::<syn::Visibility>()?;
|
||||
generate_content.parse::<syn::Token![trait]>()?;
|
||||
let keyword = generate_content.parse::<keyword::Store>()?;
|
||||
Ok(Self { vis, keyword })
|
||||
let lookahead = content.lookahead1();
|
||||
if lookahead.peek(keyword::generate_store) {
|
||||
let span = content.parse::<keyword::generate_store>()?.span();
|
||||
|
||||
let generate_content;
|
||||
syn::parenthesized!(generate_content in content);
|
||||
let vis = generate_content.parse::<syn::Visibility>()?;
|
||||
generate_content.parse::<syn::Token![trait]>()?;
|
||||
let keyword = generate_content.parse::<keyword::Store>()?;
|
||||
Ok(Self::GenerateStore { vis, keyword, span })
|
||||
} else if lookahead.peek(keyword::generate_storage_info) {
|
||||
let span = content.parse::<keyword::generate_storage_info>()?.span();
|
||||
Ok(Self::GenerateStorageInfoTrait(span))
|
||||
} else {
|
||||
Err(lookahead.error())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,12 +106,24 @@ impl PalletStructDef {
|
||||
return Err(syn::Error::new(item.span(), msg));
|
||||
};
|
||||
|
||||
let mut event_attrs: Vec<PalletStructAttr> = helper::take_item_pallet_attrs(&mut item.attrs)?;
|
||||
if event_attrs.len() > 1 {
|
||||
let msg = "Invalid pallet::pallet, multiple argument pallet::generate_store found";
|
||||
return Err(syn::Error::new(event_attrs[1].keyword.span(), msg));
|
||||
let mut store = None;
|
||||
let mut generate_storage_info = None;
|
||||
|
||||
let struct_attrs: Vec<PalletStructAttr> = helper::take_item_pallet_attrs(&mut item.attrs)?;
|
||||
for attr in struct_attrs {
|
||||
match attr {
|
||||
PalletStructAttr::GenerateStore { vis, keyword, .. } if store.is_none() => {
|
||||
store = Some((vis, keyword));
|
||||
},
|
||||
PalletStructAttr::GenerateStorageInfoTrait(span) if generate_storage_info.is_none() => {
|
||||
generate_storage_info = Some(span);
|
||||
},
|
||||
attr => {
|
||||
let msg = "Unexpected duplicated attribute";
|
||||
return Err(syn::Error::new(attr.span(), msg));
|
||||
},
|
||||
}
|
||||
}
|
||||
let store = event_attrs.pop().map(|attr| (attr.vis, attr.keyword));
|
||||
|
||||
let pallet = syn::parse2::<keyword::Pallet>(item.ident.to_token_stream())?;
|
||||
|
||||
@@ -100,6 +140,6 @@ impl PalletStructDef {
|
||||
let mut instances = vec![];
|
||||
instances.push(helper::check_type_def_gen_no_bounds(&item.generics, item.ident.span())?);
|
||||
|
||||
Ok(Self { index, instances, pallet, store, attr_span })
|
||||
Ok(Self { index, instances, pallet, store, attr_span, generate_storage_info })
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user