enum_tools/feature/iter/
table_inline.rs

1use 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}