pubfn enum_iter_inner(ast: &DeriveInput) -> syn::Result<TokenStream> { let name = &ast.ident; letgen = &ast.generics; let (impl_generics, ty_generics, where_clause) = gen.split_for_impl(); let vis = &ast.vis; let type_properties = ast.get_type_properties()?; let strum_module_path = type_properties.crate_module_path(); let doc_comment = format!("An iterator over the variants of [{}]", name);
ifgen.lifetimes().count() > 0 { return Err(syn::Error::new(
Span::call_site(), "This macro doesn't support enums with lifetimes. \
The resulting enums would be unbounded.",
));
}
let phantom_data = ifgen.type_params().count() > 0 { let g = gen.type_params().map(|param| ¶m.ident);
quote! { < ( #(#g),* ) > }
} else {
quote! { < () > }
};
let variants = match &ast.data {
Data::Enum(v) => &v.variants,
_ => return Err(non_enum_error()),
};
letmut arms = Vec::new(); letmut idx = 0usize; for variant in variants { if variant.get_variant_properties()?.disabled.is_some() { continue;
}
let ident = &variant.ident; let params = match &variant.fields {
Fields::Unit => quote! {},
Fields::Unnamed(fields) => { let defaults = ::core::iter::repeat(quote!(::core::default::Default::default()))
.take(fields.unnamed.len());
quote! { (#(#defaults),*) }
}
Fields::Named(fields) => { let fields = fields
.named
.iter()
.map(|field| field.ident.as_ref().unwrap());
quote! { {#(#fields: ::core::default::Default::default()),*} }
}
};
let variant_count = arms.len();
arms.push(quote! { _ => ::core::option::Option::None }); let iter_name = syn::parse_str::<Ident>(&format!("{}Iter", name)).unwrap();
// Create a string literal "MyEnumIter" to use in the debug impl. let iter_name_debug_struct =
syn::parse_str::<syn::LitStr>(&format!("\"{}\"", iter_name)).unwrap();
impl#impl_generics ::core::fmt::Debug for#iter_name#ty_generics#where_clause { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { // We don't know if the variants implement debug themselves so the only thing we // can really show is how many elements are left.
f.debug_struct(#iter_name_debug_struct)
.field("len", &self.len())
.finish()
}
}
fn nth(&mutself, n: usize) -> ::core::option::Option<<Selfas Iterator>::Item> { let idx = self.idx + n + 1; if idx + self.back_idx > #variant_count { // We went past the end of the iterator. Freeze idx at #variant_count // so that it doesn't overflow if the user calls this repeatedly. // See PR #76 for context. self.idx = #variant_count;
::core::option::Option::None
} else { self.idx = idx; #iter_name::get(self, idx - 1)
}
}
}
ifself.idx + back_idx > #variant_count { // We went past the end of the iterator. Freeze back_idx at #variant_count // so that it doesn't overflow if the user calls this repeatedly. // See PR #76 for context. self.back_idx = #variant_count;
::core::option::Option::None
} else { self.back_idx = back_idx; #iter_name::get(self, #variant_count - self.back_idx)
}
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.