@@ -194,18 +194,7 @@ pub fn process_generics(def: &mut Def) -> syn::Result<Vec<ResultOnEmptyStructMet
194
194
let on_empty = on_empty. unwrap_or_else ( || default_on_empty ( value) ) ;
195
195
args. args . push ( syn:: GenericArgument :: Type ( on_empty) ) ;
196
196
} ,
197
- StorageGenerics :: Map { hasher, key, value, query_kind, on_empty, max_values } => {
198
- args. args . push ( syn:: GenericArgument :: Type ( hasher) ) ;
199
- args. args . push ( syn:: GenericArgument :: Type ( key) ) ;
200
- args. args . push ( syn:: GenericArgument :: Type ( value. clone ( ) ) ) ;
201
- let mut query_kind = query_kind. unwrap_or_else ( || default_query_kind. clone ( ) ) ;
202
- set_result_query_type_parameter ( & mut query_kind) ?;
203
- args. args . push ( syn:: GenericArgument :: Type ( query_kind) ) ;
204
- let on_empty = on_empty. unwrap_or_else ( || default_on_empty ( value) ) ;
205
- args. args . push ( syn:: GenericArgument :: Type ( on_empty) ) ;
206
- let max_values = max_values. unwrap_or_else ( || default_max_values. clone ( ) ) ;
207
- args. args . push ( syn:: GenericArgument :: Type ( max_values) ) ;
208
- } ,
197
+ StorageGenerics :: Map { hasher, key, value, query_kind, on_empty, max_values } |
209
198
StorageGenerics :: CountedMap {
210
199
hasher,
211
200
key,
@@ -248,7 +237,14 @@ pub fn process_generics(def: &mut Def) -> syn::Result<Vec<ResultOnEmptyStructMet
248
237
let max_values = max_values. unwrap_or_else ( || default_max_values. clone ( ) ) ;
249
238
args. args . push ( syn:: GenericArgument :: Type ( max_values) ) ;
250
239
} ,
251
- StorageGenerics :: NMap { keygen, value, query_kind, on_empty, max_values } => {
240
+ StorageGenerics :: NMap { keygen, value, query_kind, on_empty, max_values } |
241
+ StorageGenerics :: CountedNMap {
242
+ keygen,
243
+ value,
244
+ query_kind,
245
+ on_empty,
246
+ max_values,
247
+ } => {
252
248
args. args . push ( syn:: GenericArgument :: Type ( keygen) ) ;
253
249
args. args . push ( syn:: GenericArgument :: Type ( value. clone ( ) ) ) ;
254
250
let mut query_kind = query_kind. unwrap_or_else ( || default_query_kind. clone ( ) ) ;
@@ -265,7 +261,7 @@ pub fn process_generics(def: &mut Def) -> syn::Result<Vec<ResultOnEmptyStructMet
265
261
266
262
let ( value_idx, query_idx, on_empty_idx) = match storage_def. metadata {
267
263
Metadata :: Value { .. } => ( 1 , 2 , 3 ) ,
268
- Metadata :: NMap { .. } => ( 2 , 3 , 4 ) ,
264
+ Metadata :: NMap { .. } | Metadata :: CountedNMap { .. } => ( 2 , 3 , 4 ) ,
269
265
Metadata :: Map { .. } | Metadata :: CountedMap { .. } => ( 3 , 4 , 5 ) ,
270
266
Metadata :: DoubleMap { .. } => ( 5 , 6 , 7 ) ,
271
267
} ;
@@ -359,6 +355,17 @@ fn augment_final_docs(def: &mut Def) {
359
355
) ;
360
356
push_string_literal ( & doc_line, storage) ;
361
357
} ,
358
+ Metadata :: CountedNMap { keys, value, .. } => {
359
+ let doc_line = format ! (
360
+ "Storage type is [`CountedStorageNMap`] with keys type ({}) and value type {}." ,
361
+ keys. iter( )
362
+ . map( |k| k. to_token_stream( ) . to_string( ) )
363
+ . collect:: <Vec <_>>( )
364
+ . join( ", " ) ,
365
+ value. to_token_stream( )
366
+ ) ;
367
+ push_string_literal ( & doc_line, storage) ;
368
+ } ,
362
369
Metadata :: CountedMap { key, value } => {
363
370
let doc_line = format ! (
364
371
"Storage type is [`CountedStorageMap`] with key type {} and value type {}." ,
@@ -579,6 +586,36 @@ pub fn expand_storages(def: &mut Def) -> proc_macro2::TokenStream {
579
586
}
580
587
)
581
588
} ,
589
+ Metadata :: CountedNMap { keygen, value, .. } => {
590
+ let query = match storage. query_kind . as_ref ( ) . expect ( "Checked by def" ) {
591
+ QueryKind :: OptionQuery => quote:: quote_spanned!( storage. attr_span =>
592
+ Option <#value>
593
+ ) ,
594
+ QueryKind :: ResultQuery ( error_path, _) => {
595
+ quote:: quote_spanned!( storage. attr_span =>
596
+ Result <#value, #error_path>
597
+ )
598
+ } ,
599
+ QueryKind :: ValueQuery => quote:: quote!( #value) ,
600
+ } ;
601
+ quote:: quote_spanned!( storage. attr_span =>
602
+ #( #cfg_attrs) *
603
+ impl <#type_impl_gen> #pallet_ident<#type_use_gen> #completed_where_clause {
604
+ #[ doc = #getter_doc_line]
605
+ pub fn #getter<KArg >( key: KArg ) -> #query
606
+ where
607
+ KArg : #frame_support:: storage:: types:: EncodeLikeTuple <
608
+ <#keygen as #frame_support:: storage:: types:: KeyGenerator >:: KArg
609
+ >
610
+ + #frame_support:: storage:: types:: TupleToEncodedIter ,
611
+ {
612
+ // NOTE: we can't use any trait here because CountedStorageNMap
613
+ // doesn't implement any.
614
+ <#full_ident>:: get( key)
615
+ }
616
+ }
617
+ )
618
+ } ,
582
619
}
583
620
} else {
584
621
Default :: default ( )
@@ -595,40 +632,72 @@ pub fn expand_storages(def: &mut Def) -> proc_macro2::TokenStream {
595
632
596
633
let cfg_attrs = & storage_def. cfg_attrs ;
597
634
598
- let maybe_counter = if let Metadata :: CountedMap { .. } = storage_def. metadata {
599
- let counter_prefix_struct_ident = counter_prefix_ident ( & storage_def. ident ) ;
600
- let counter_prefix_struct_const = counter_prefix ( & prefix_struct_const) ;
601
-
602
- quote:: quote_spanned!( storage_def. attr_span =>
603
- #( #cfg_attrs) *
604
- #[ doc( hidden) ]
605
- #prefix_struct_vis struct #counter_prefix_struct_ident<#type_use_gen>(
606
- core:: marker:: PhantomData <( #type_use_gen, ) >
607
- ) ;
608
- #( #cfg_attrs) *
609
- impl <#type_impl_gen> #frame_support:: traits:: StorageInstance
610
- for #counter_prefix_struct_ident<#type_use_gen>
611
- #config_where_clause
612
- {
613
- fn pallet_prefix( ) -> & ' static str {
614
- <
615
- <T as #frame_system:: Config >:: PalletInfo
616
- as #frame_support:: traits:: PalletInfo
617
- >:: name:: <Pallet <#type_use_gen>>( )
618
- . expect( "No name found for the pallet in the runtime! This usually means that the pallet wasn't added to `construct_runtime!`." )
635
+ let maybe_counter = match storage_def. metadata {
636
+ Metadata :: CountedMap { .. } => {
637
+ let counter_prefix_struct_ident = counter_prefix_ident ( & storage_def. ident ) ;
638
+ let counter_prefix_struct_const = counter_prefix ( & prefix_struct_const) ;
639
+ quote:: quote_spanned!( storage_def. attr_span =>
640
+ #( #cfg_attrs) *
641
+ #[ doc( hidden) ]
642
+ #prefix_struct_vis struct #counter_prefix_struct_ident<#type_use_gen>(
643
+ core:: marker:: PhantomData <( #type_use_gen, ) >
644
+ ) ;
645
+ #( #cfg_attrs) *
646
+ impl <#type_impl_gen> #frame_support:: traits:: StorageInstance
647
+ for #counter_prefix_struct_ident<#type_use_gen>
648
+ #config_where_clause
649
+ {
650
+ fn pallet_prefix( ) -> & ' static str {
651
+ <
652
+ <T as #frame_system:: Config >:: PalletInfo
653
+ as #frame_support:: traits:: PalletInfo
654
+ >:: name:: <Pallet <#type_use_gen>>( )
655
+ . expect( "No name found for the pallet in the runtime! This usually means that the pallet wasn't added to `construct_runtime!`." )
656
+ }
657
+ const STORAGE_PREFIX : & ' static str = #counter_prefix_struct_const;
619
658
}
620
- const STORAGE_PREFIX : & ' static str = #counter_prefix_struct_const;
621
- }
622
- #( #cfg_attrs) *
623
- impl <#type_impl_gen> #frame_support:: storage:: types:: CountedStorageMapInstance
624
- for #prefix_struct_ident<#type_use_gen>
625
- #config_where_clause
626
- {
627
- type CounterPrefix = #counter_prefix_struct_ident<#type_use_gen>;
628
- }
629
- )
630
- } else {
631
- proc_macro2:: TokenStream :: default ( )
659
+ #( #cfg_attrs) *
660
+ impl <#type_impl_gen> #frame_support:: storage:: types:: CountedStorageMapInstance
661
+ for #prefix_struct_ident<#type_use_gen>
662
+ #config_where_clause
663
+ {
664
+ type CounterPrefix = #counter_prefix_struct_ident<#type_use_gen>;
665
+ }
666
+ )
667
+ } ,
668
+ Metadata :: CountedNMap { .. } => {
669
+ let counter_prefix_struct_ident = counter_prefix_ident ( & storage_def. ident ) ;
670
+ let counter_prefix_struct_const = counter_prefix ( & prefix_struct_const) ;
671
+ quote:: quote_spanned!( storage_def. attr_span =>
672
+ #( #cfg_attrs) *
673
+ #[ doc( hidden) ]
674
+ #prefix_struct_vis struct #counter_prefix_struct_ident<#type_use_gen>(
675
+ core:: marker:: PhantomData <( #type_use_gen, ) >
676
+ ) ;
677
+ #( #cfg_attrs) *
678
+ impl <#type_impl_gen> #frame_support:: traits:: StorageInstance
679
+ for #counter_prefix_struct_ident<#type_use_gen>
680
+ #config_where_clause
681
+ {
682
+ fn pallet_prefix( ) -> & ' static str {
683
+ <
684
+ <T as #frame_system:: Config >:: PalletInfo
685
+ as #frame_support:: traits:: PalletInfo
686
+ >:: name:: <Pallet <#type_use_gen>>( )
687
+ . expect( "No name found for the pallet in the runtime! This usually means that the pallet wasn't added to `construct_runtime!`." )
688
+ }
689
+ const STORAGE_PREFIX : & ' static str = #counter_prefix_struct_const;
690
+ }
691
+ #( #cfg_attrs) *
692
+ impl <#type_impl_gen> #frame_support:: storage:: types:: CountedStorageNMapInstance
693
+ for #prefix_struct_ident<#type_use_gen>
694
+ #config_where_clause
695
+ {
696
+ type CounterPrefix = #counter_prefix_struct_ident<#type_use_gen>;
697
+ }
698
+ )
699
+ } ,
700
+ _ => proc_macro2:: TokenStream :: default ( ) ,
632
701
} ;
633
702
634
703
quote:: quote_spanned!( storage_def. attr_span =>
0 commit comments