Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
9d98d15
initial impl
shawntabrizi Jun 12, 2021
989d02b
expose in pallet_prelude
shawntabrizi Jun 12, 2021
a6321b1
temp test
shawntabrizi Jun 12, 2021
9ce58da
Apply suggestions from code review
gui1117 Jun 14, 2021
899eea4
implement with macro help.
gui1117 Jun 14, 2021
b5b74a1
Merge remote-tracking branch 'origin/master' into shawntabrizi-counte…
gui1117 Jun 15, 2021
43e635f
test for macro generation
gui1117 Jun 15, 2021
9885891
add iterable functions, some test and fixes
gui1117 Jun 15, 2021
2406021
Merge remote-tracking branch 'origin/master' into shawntabrizi-counte…
gui1117 Jun 16, 2021
4f31878
fix merge
gui1117 Jun 16, 2021
c588233
doc
gui1117 Jun 16, 2021
9c362a6
Update frame/support/src/storage/types/counted_map.rs
gui1117 Jul 5, 2021
ed44b79
Merge remote-tracking branch 'origin/master' into gui-shawntabrizi-co…
gui1117 Aug 6, 2021
cdb3fa3
fix merge
gui1117 Aug 6, 2021
f7417cf
fmt
gui1117 Aug 6, 2021
61208a4
fix spelling
gui1117 Aug 6, 2021
30da101
improve on removal
gui1117 Aug 6, 2021
c546c2e
fix partial storage info
gui1117 Aug 6, 2021
1e11c16
fmt
gui1117 Aug 6, 2021
497bc69
add license
gui1117 Aug 7, 2021
cc249fb
suggested renames
gui1117 Aug 7, 2021
4d6de59
fix typo
gui1117 Aug 7, 2021
3313f73
Merge remote-tracking branch 'origin/master' into gui-shawntabrizi-co…
gui1117 Sep 15, 2021
a4c7f3f
fix test
gui1117 Sep 15, 2021
4841dbb
fmt
gui1117 Sep 15, 2021
b3d2111
fix ui tests
gui1117 Sep 16, 2021
4b62aab
clearer doc
gui1117 Sep 16, 2021
448937d
better doc
gui1117 Sep 16, 2021
cc13432
add metadata test
gui1117 Sep 16, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Merge remote-tracking branch 'origin/master' into gui-shawntabrizi-co…
…unted-map
  • Loading branch information
gui1117 committed Aug 6, 2021
commit ed44b79865f6c0952388e8cb5f1d2a2786e959cf
228 changes: 108 additions & 120 deletions frame/support/procedural/src/pallet/expand/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ pub fn process_generics(def: &mut Def) -> syn::Result<()> {
args.args.push(syn::GenericArgument::Type(on_empty));
let max_values = max_values.unwrap_or_else(|| default_max_values.clone());
args.args.push(syn::GenericArgument::Type(max_values));
}
},
StorageGenerics::CountedMap {
hasher, key, value, query_kind, on_empty, max_values
} => {
Expand All @@ -157,7 +157,7 @@ pub fn process_generics(def: &mut Def) -> syn::Result<()> {
args.args.push(syn::GenericArgument::Type(on_empty));
let max_values = max_values.unwrap_or_else(|| default_max_values.clone());
args.args.push(syn::GenericArgument::Type(max_values));
}
},
StorageGenerics::DoubleMap {
hasher1,
key1,
Expand Down Expand Up @@ -223,9 +223,12 @@ pub fn expand_storages(def: &mut Def) -> proc_macro2::TokenStream {
let frame_system = &def.frame_system;
let pallet_ident = &def.pallet_struct.pallet;

let entries = def.storages.iter()
.map(|storage| {
let docs = &storage.docs;
let entries = def.storages.iter().map(|storage| {
let docs = &storage.docs;

let ident = &storage.ident;
let gen = &def.type_use_generics(storage.attr_span);
let full_ident = quote::quote_spanned!(storage.attr_span => #ident<#gen> );

let cfg_attrs = &storage.cfg_attrs;

Expand All @@ -236,6 +239,9 @@ pub fn expand_storages(def: &mut Def) -> proc_macro2::TokenStream {
Metadata::Map { .. } => quote::quote_spanned!(storage.attr_span =>
#frame_support::storage::types::StorageMapMetadata
),
Metadata::CountedMap { .. } => quote::quote_spanned!(storage.attr_span =>
#frame_support::storage::types::CountedStorageMapMetadata
),
Metadata::DoubleMap { .. } => quote::quote_spanned!(storage.attr_span =>
#frame_support::storage::types::StorageDoubleMapMetadata
),
Expand All @@ -244,132 +250,114 @@ pub fn expand_storages(def: &mut Def) -> proc_macro2::TokenStream {
),
};

let metadata_trait = match &storage.metadata {
Metadata::Value { .. } => quote::quote_spanned!(storage.attr_span =>
#frame_support::storage::types::StorageValueMetadata
),
Metadata::Map { .. } => quote::quote_spanned!(storage.attr_span =>
#frame_support::storage::types::StorageMapMetadata
),
Metadata::CountedMap { .. } => quote::quote_spanned!(storage.attr_span =>
#frame_support::storage::types::CountedStorageMapMetadata
),
Metadata::DoubleMap { .. } => quote::quote_spanned!(storage.attr_span =>
#frame_support::storage::types::StorageDoubleMapMetadata
let ty = match &storage.metadata {
Metadata::Value { value } => {
let value = clean_type_string(&quote::quote!(#value).to_string());
quote::quote_spanned!(storage.attr_span =>
#frame_support::metadata::StorageEntryType::Plain(
#frame_support::metadata::DecodeDifferent::Encode(#value)
)
)
},
Metadata::Map { key, value } => {
let value = clean_type_string(&quote::quote!(#value).to_string());
let key = clean_type_string(&quote::quote!(#key).to_string());
quote::quote_spanned!(storage.attr_span =>
#frame_support::metadata::StorageEntryType::Map {
hasher: <#full_ident as #metadata_trait>::HASHER,
key: #frame_support::metadata::DecodeDifferent::Encode(#key),
value: #frame_support::metadata::DecodeDifferent::Encode(#value),
unused: false,
}
)
},
Metadata::CountedMap { key, value } => {
let value = clean_type_string(&quote::quote!(#value).to_string());
let key = clean_type_string(&quote::quote!(#key).to_string());
quote::quote_spanned!(storage.attr_span =>
#frame_support::metadata::StorageEntryType::Map {
hasher: <#full_ident as #metadata_trait>::HASHER,
key: #frame_support::metadata::DecodeDifferent::Encode(#key),
value: #frame_support::metadata::DecodeDifferent::Encode(#value),
unused: false,
}
)
},
Metadata::DoubleMap { key1, key2, value } => {
let value = clean_type_string(&quote::quote!(#value).to_string());
let key1 = clean_type_string(&quote::quote!(#key1).to_string());
let key2 = clean_type_string(&quote::quote!(#key2).to_string());
quote::quote_spanned!(storage.attr_span =>
#frame_support::metadata::StorageEntryType::DoubleMap {
hasher: <#full_ident as #metadata_trait>::HASHER1,
key2_hasher: <#full_ident as #metadata_trait>::HASHER2,
key1: #frame_support::metadata::DecodeDifferent::Encode(#key1),
key2: #frame_support::metadata::DecodeDifferent::Encode(#key2),
value: #frame_support::metadata::DecodeDifferent::Encode(#value),
}
)
},
Metadata::NMap { keys, value, .. } => {
let keys = keys
.iter()
.map(|key| clean_type_string(&quote::quote!(#key).to_string()))
.collect::<Vec<_>>();
let value = clean_type_string(&quote::quote!(#value).to_string());
quote::quote_spanned!(storage.attr_span =>
#frame_support::metadata::StorageEntryType::NMap {
keys: #frame_support::metadata::DecodeDifferent::Encode(&[
#( #keys, )*
]),
hashers: #frame_support::metadata::DecodeDifferent::Encode(
<#full_ident as #metadata_trait>::HASHERS,
),
value: #frame_support::metadata::DecodeDifferent::Encode(#value),
}
)
},
};

let mut metadata = quote::quote_spanned!(storage.attr_span =>
#(#cfg_attrs)* #frame_support::metadata::StorageEntryMetadata {
name: #frame_support::metadata::DecodeDifferent::Encode(
<#full_ident as #metadata_trait>::NAME
),
Metadata::NMap { .. } => quote::quote_spanned!(storage.attr_span =>
#frame_support::storage::types::StorageNMapMetadata
modifier: <#full_ident as #metadata_trait>::MODIFIER,
ty: #ty,
default: #frame_support::metadata::DecodeDifferent::Encode(
<#full_ident as #metadata_trait>::DEFAULT
),
};

let ty = match &storage.metadata {
Metadata::Value { value } => {
let value = clean_type_string(&quote::quote!(#value).to_string());
quote::quote_spanned!(storage.attr_span =>
#frame_support::metadata::StorageEntryType::Plain(
#frame_support::metadata::DecodeDifferent::Encode(#value)
)
)
},
Metadata::Map { key, value } => {
let value = clean_type_string(&quote::quote!(#value).to_string());
let key = clean_type_string(&quote::quote!(#key).to_string());
quote::quote_spanned!(storage.attr_span =>
#frame_support::metadata::StorageEntryType::Map {
hasher: <#full_ident as #metadata_trait>::HASHER,
key: #frame_support::metadata::DecodeDifferent::Encode(#key),
value: #frame_support::metadata::DecodeDifferent::Encode(#value),
unused: false,
}
)
},
Metadata::CountedMap { key, value } => {
let value = clean_type_string(&quote::quote!(#value).to_string());
let key = clean_type_string(&quote::quote!(#key).to_string());
quote::quote_spanned!(storage.attr_span =>
#frame_support::metadata::StorageEntryType::Map {
hasher: <#full_ident as #metadata_trait>::HASHER,
key: #frame_support::metadata::DecodeDifferent::Encode(#key),
value: #frame_support::metadata::DecodeDifferent::Encode(#value),
unused: false,
}
)
},
Metadata::DoubleMap { key1, key2, value } => {
let value = clean_type_string(&quote::quote!(#value).to_string());
let key1 = clean_type_string(&quote::quote!(#key1).to_string());
let key2 = clean_type_string(&quote::quote!(#key2).to_string());
quote::quote_spanned!(storage.attr_span =>
#frame_support::metadata::StorageEntryType::DoubleMap {
hasher: <#full_ident as #metadata_trait>::HASHER1,
key2_hasher: <#full_ident as #metadata_trait>::HASHER2,
key1: #frame_support::metadata::DecodeDifferent::Encode(#key1),
key2: #frame_support::metadata::DecodeDifferent::Encode(#key2),
value: #frame_support::metadata::DecodeDifferent::Encode(#value),
}
)
},
Metadata::NMap { keys, value, .. } => {
let keys = keys
.iter()
.map(|key| clean_type_string(&quote::quote!(#key).to_string()))
.collect::<Vec<_>>();
let value = clean_type_string(&quote::quote!(#value).to_string());
quote::quote_spanned!(storage.attr_span =>
#frame_support::metadata::StorageEntryType::NMap {
keys: #frame_support::metadata::DecodeDifferent::Encode(&[
#( #keys, )*
]),
hashers: #frame_support::metadata::DecodeDifferent::Encode(
<#full_ident as #metadata_trait>::HASHERS,
),
value: #frame_support::metadata::DecodeDifferent::Encode(#value),
}
)
}
};
documentation: #frame_support::metadata::DecodeDifferent::Encode(&[
#( #docs, )*
]),
}
);

let mut metadata = quote::quote_spanned!(storage.attr_span =>
#(#cfg_attrs)* #frame_support::metadata::StorageEntryMetadata {
// Additional metadata for some storages:
if let Metadata::CountedMap { .. } = storage.metadata {
metadata.extend(quote::quote_spanned!(storage.attr_span =>
, #(#cfg_attrs)* #frame_support::metadata::StorageEntryMetadata {
name: #frame_support::metadata::DecodeDifferent::Encode(
<#full_ident as #metadata_trait>::NAME
<#full_ident as #metadata_trait>::COUNTER_NAME
),
modifier: <#full_ident as #metadata_trait>::COUNTER_MODIFIER,
ty: #frame_support::metadata::StorageEntryType::Plain(
#frame_support::metadata::DecodeDifferent::Encode(
<#full_ident as #metadata_trait>::COUNTER_TY
)
),
modifier: <#full_ident as #metadata_trait>::MODIFIER,
ty: #ty,
default: #frame_support::metadata::DecodeDifferent::Encode(
<#full_ident as #metadata_trait>::DEFAULT
<#full_ident as #metadata_trait>::COUNTER_DEFAULT
),
documentation: #frame_support::metadata::DecodeDifferent::Encode(&[
#( #docs, )*
<#full_ident as #metadata_trait>::COUNTER_DOC
]),
}
);

// Additional metadata for some storages:
if let Metadata::CountedMap { .. } = storage.metadata {
metadata.extend(quote::quote_spanned!(storage.attr_span =>
, #(#cfg_attrs)* #frame_support::metadata::StorageEntryMetadata {
name: #frame_support::metadata::DecodeDifferent::Encode(
<#full_ident as #metadata_trait>::COUNTER_NAME
),
modifier: <#full_ident as #metadata_trait>::COUNTER_MODIFIER,
ty: #frame_support::metadata::StorageEntryType::Plain(
#frame_support::metadata::DecodeDifferent::Encode(
<#full_ident as #metadata_trait>::COUNTER_TY
)
),
default: #frame_support::metadata::DecodeDifferent::Encode(
<#full_ident as #metadata_trait>::COUNTER_DEFAULT
),
documentation: #frame_support::metadata::DecodeDifferent::Encode(&[
<#full_ident as #metadata_trait>::COUNTER_DOC
]),
}
));
}
));
}

metadata
});
metadata
});

let getters = def.storages.iter().map(|storage| {
if let Some(getter) = &storage.getter {
Expand Down
27 changes: 9 additions & 18 deletions frame/support/procedural/src/pallet/parse/storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,16 +86,8 @@ pub enum Metadata {
Value { value: syn::Type },
Map { value: syn::Type, key: syn::Type },
CountedMap { value: syn::Type, key: syn::Type },
DoubleMap {
value: syn::Type,
key1: syn::Type,
key2: syn::Type
},
NMap {
keys: Vec<syn::Type>,
keygen: syn::Type,
value: syn::Type,
},
DoubleMap { value: syn::Type, key1: syn::Type, key2: syn::Type },
NMap { keys: Vec<syn::Type>, keygen: syn::Type, value: syn::Type },
}

pub enum QueryKind {
Expand Down Expand Up @@ -200,12 +192,11 @@ impl StorageGenerics {
/// Return the query kind from the defined generics
fn query_kind(&self) -> Option<syn::Type> {
match &self {
Self::DoubleMap { query_kind, .. }
| Self::Map { query_kind, .. }
| Self::CountedMap { query_kind, .. }
| Self::Value { query_kind, .. }
| Self::NMap { query_kind, .. }
=> query_kind.clone(),
Self::DoubleMap { query_kind, .. } |
Self::Map { query_kind, .. } |
Self::CountedMap { query_kind, .. } |
Self::Value { query_kind, .. } |
Self::NMap { query_kind, .. } => query_kind.clone(),
}
}
}
Expand Down Expand Up @@ -342,7 +333,7 @@ fn process_named_generics(
on_empty: parsed.remove("OnEmpty").map(|binding| binding.ty),
max_values: parsed.remove("MaxValues").map(|binding| binding.ty),
}
}
},
StorageKind::CountedMap => {
check_generics(
&parsed,
Expand All @@ -366,7 +357,7 @@ fn process_named_generics(
on_empty: parsed.remove("OnEmpty").map(|binding| binding.ty),
max_values: parsed.remove("MaxValues").map(|binding| binding.ty),
}
}
},
StorageKind::DoubleMap => {
check_generics(
&parsed,
Expand Down
9 changes: 3 additions & 6 deletions frame/support/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1283,19 +1283,16 @@ pub mod pallet_prelude {
bounded_vec::BoundedVec,
types::{
Key as NMapKey, OptionQuery, StorageDoubleMap, StorageMap, StorageNMap,
StorageValue, ValueQuery,
StorageValue, ValueQuery, CountedStorageMap,
},
},
traits::{
ConstU32, EnsureOrigin, Get, GetDefault, GetStorageVersion, Hooks, IsType,
PalletInfoAccess, StorageInfoTrait,
},
weights::{DispatchClass, Pays, Weight},
storage::types::{
Key as NMapKey, StorageDoubleMap, StorageMap, StorageNMap, StorageValue, ValueQuery,
OptionQuery, CountedStorageMap,
},
storage::bounded_vec::BoundedVec,
Blake2_128, Blake2_128Concat, Blake2_256, CloneNoBound, DebugNoBound, EqNoBound, Identity,
PartialEqNoBound, RuntimeDebug, RuntimeDebugNoBound, Twox128, Twox256, Twox64Concat,
};
pub use codec::{Decode, Encode, MaxEncodedLen};
pub use sp_runtime::{
Expand Down
31 changes: 31 additions & 0 deletions frame/support/src/storage/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -812,6 +812,37 @@ impl PrefixIteratorOnRemoval for () {
}

impl<T, OnRemoval> PrefixIterator<T, OnRemoval> {
/// Creates a new `PrefixIterator`, iterating after `previous_key` and filtering out keys that
/// are not prefixed with `prefix`.
///
/// A `decode_fn` function must also be supplied, and it takes in two `&[u8]` parameters,
/// returning a `Result` containing the decoded type `T` if successful, and a `codec::Error` on
/// failure. The first `&[u8]` argument represents the raw, undecoded key without the prefix of
/// the current item, while the second `&[u8]` argument denotes the corresponding raw,
/// undecoded value.
pub fn new(
prefix: Vec<u8>,
previous_key: Vec<u8>,
decode_fn: fn(&[u8], &[u8]) -> Result<T, codec::Error>,
) -> Self {
PrefixIterator { prefix, previous_key, drain: false, closure: decode_fn }
}

/// Get the last key that has been iterated upon and return it.
pub fn last_raw_key(&self) -> &[u8] {
&self.previous_key
}

/// Get the prefix that is being iterated upon for this iterator and return it.
pub fn prefix(&self) -> &[u8] {
&self.prefix
}

/// Set the key that the iterator should start iterating after.
pub fn set_last_raw_key(&mut self, previous_key: Vec<u8>) {
self.previous_key = previous_key;
}

/// Mutate this iterator into a draining iterator; items iterated are removed from storage.
pub fn drain(mut self) -> Self {
self.drain = true;
Expand Down
You are viewing a condensed version of this merge commit. You can view the full changes here.