enum_tools/feature/iter/
table_inline.rs1use crate::feature::iter::{extend_common, FeatureIter};
2use crate::generator::names::Names;
3use crate::generator::Derive;
4use proc_macro2::{Span, TokenStream};
5use quote::{quote, ToTokens};
6use syn::LitInt;
7
8impl FeatureIter {
9 pub(crate) fn check_table_inline(&self) {}
10
11 pub(crate) fn iter_table_inline(
12 &self,
13 derive: &Derive,
14 names: &Names,
15 ) -> (TokenStream, TokenStream) {
16 let enums = derive.values.iter().map(|(_, (v, _))| v);
17 let num_values = LitInt::new(&derive.num_values.to_string(), Span::call_site());
18
19 let Derive { ident_enum, .. } = derive;
20 let Names {
21 ident_iter_fn,
22 ident_iter_struct,
23 ..
24 } = names;
25 let vis = self.vis.as_ref().unwrap_or(&derive.vis_enum);
26
27 let doc_inner = format!(" An Iterator over the items of {ident_enum}, in value order.");
28 let doc_outer = format!(" An Iterator over the items of {ident_enum}.");
29
30 let inner = quote! {
31 #[doc=#doc_inner]
32 #[inline]
33 #vis fn #ident_iter_fn() -> #ident_iter_struct {
34 use ::core::iter::IntoIterator;
35 #ident_iter_struct {
36 inner: [ #(#ident_enum::#enums),* ].into_iter()
37 }
38 }
39 };
40
41 let mut outer = quote! {
42 #[doc=#doc_outer]
43 #vis struct #ident_iter_struct {
44 inner: ::core::array::IntoIter<#ident_enum, #num_values>
45 }
46 };
47
48 extend_common(
49 &mut outer,
50 ident_enum.to_token_stream(),
51 ident_iter_struct,
52 false,
53 );
54
55 (inner, outer)
56 }
57}