MCPcopy Create free account
hub / github.com/csskit/csskit / derive

Function derive

crates/csskit_derives/src/css_feature.rs:51–119  ·  view source on GitHub ↗
(input: DeriveInput)

Source from the content-addressed store, hash-verified

49}
50
51pub fn derive(input: DeriveInput) -> Result<TokenStream> {
52 let ident = input.ident;
53 let generics = &input.generics;
54 let (impl_generics, type_generics, _) = generics.split_for_impl();
55 let feature: CSSFeatureName = CSSFeatureName::try_from(input.attrs.as_slice())?;
56 let steps = match &input.data {
57 Data::Union(_) => return Err(Error::new(ident.span(), "Cannot derive on a Union")),
58
59 Data::Struct(DataStruct { fields, .. }) => {
60 if fields.is_empty() {
61 return Err(Error::new(ident.span(), "Cannot derive on empty Struct"));
62 } else {
63 quote! {}
64 }
65 }
66
67 Data::Enum(DataEnum { variants, .. }) => {
68 if variants.is_empty() {
69 return Err(Error::new(ident.span(), "Cannot derive on empty Enum"));
70 } else {
71 let variants = variants
72 .iter()
73 .map(|variant| {
74 let variant_ident = &variant.ident;
75 let pattern = match &variant.fields {
76 Fields::Named(fields) => {
77 let ignores = fields.named.iter().map(|f| {
78 let fname = f.ident.as_ref().unwrap();
79 quote! { #fname: _ }
80 });
81 quote! { Self::#variant_ident { #(#ignores),* } }
82 }
83 _ => {
84 let members = variant.fields.members().map(|_| quote! { _ });
85 quote! { Self::#variant_ident(#(#members),*) }
86 }
87 };
88 if let Ok(feature) = CSSFeatureName::try_from(variant.attrs.as_slice()) {
89 let step = by_feature_name(feature.to_string());
90 quote! { #pattern => { #step }, }
91 } else {
92 let str = feature.to_string();
93 let guessed_step =
94 by_feature_name(format!("{}.{}", str, variant_ident.to_string().to_kebab_case()));
95 let or_step = by_feature_name(feature.to_string());
96 quote! { #pattern => { #guessed_step.or_else(|| #or_step) }, }
97 }
98 })
99 .collect::<Vec<_>>();
100 let by_feature_name = by_feature_name(feature.to_string());
101 quote! {
102 match self {
103 #(#variants)*
104 _ => { #by_feature_name },
105 }
106 }
107 }
108 }

Callers

nothing calls this directly

Calls 6

ErrClass · 0.85
by_feature_nameFunction · 0.85
iterMethod · 0.80
as_refMethod · 0.80
spanMethod · 0.45
is_emptyMethod · 0.45

Tested by

no test coverage detected