tailwind_lengths.rs

 1use proc_macro::TokenStream;
 2use proc_macro2::TokenStream as TokenStream2;
 3use quote::{format_ident, quote};
 4use syn::{parse_macro_input, FnArg, ItemFn, PatType};
 5
 6pub fn tailwind_lengths(_attr: TokenStream, item: TokenStream) -> TokenStream {
 7    let input_function = parse_macro_input!(item as ItemFn);
 8
 9    let visibility = &input_function.vis;
10    let function_signature = input_function.sig.clone();
11    let function_body = input_function.block;
12    let where_clause = &function_signature.generics.where_clause;
13
14    let argument_name = match function_signature.inputs.iter().nth(1) {
15        Some(FnArg::Typed(PatType { pat, .. })) => pat,
16        _ => panic!("Couldn't find the second argument in the function signature"),
17    };
18
19    let mut output_functions = TokenStream2::new();
20
21    for (length, value) in fixed_lengths() {
22        let function_name = format_ident!("{}{}", function_signature.ident, length);
23        output_functions.extend(quote! {
24            #visibility fn #function_name(mut self) -> Self #where_clause {
25                let #argument_name = #value.into();
26                #function_body
27            }
28        });
29    }
30
31    output_functions.into()
32}
33
34fn fixed_lengths() -> Vec<(&'static str, TokenStream2)> {
35    vec![
36        ("0", quote! { DefinedLength::Pixels(0.) }),
37        ("px", quote! { DefinedLength::Pixels(1.) }),
38        ("0_5", quote! { DefinedLength::Rems(0.125) }),
39        ("1", quote! { DefinedLength::Rems(0.25) }),
40        ("1_5", quote! { DefinedLength::Rems(0.375) }),
41        ("2", quote! { DefinedLength::Rems(0.5) }),
42        ("2_5", quote! { DefinedLength::Rems(0.625) }),
43        ("3", quote! { DefinedLength::Rems(0.75) }),
44        ("3_5", quote! { DefinedLength::Rems(0.875) }),
45        ("4", quote! { DefinedLength::Rems(1.) }),
46        ("5", quote! { DefinedLength::Rems(1.25) }),
47        ("6", quote! { DefinedLength::Rems(1.5) }),
48        ("7", quote! { DefinedLength::Rems(1.75) }),
49        ("8", quote! { DefinedLength::Rems(2.) }),
50        ("9", quote! { DefinedLength::Rems(2.25) }),
51        ("10", quote! { DefinedLength::Rems(2.5) }),
52        ("11", quote! { DefinedLength::Rems(2.75) }),
53        ("12", quote! { DefinedLength::Rems(3.) }),
54        ("14", quote! { DefinedLength::Rems(3.5) }),
55        ("16", quote! { DefinedLength::Rems(4.) }),
56        ("20", quote! { DefinedLength::Rems(5.) }),
57        ("24", quote! { DefinedLength::Rems(6.) }),
58        ("28", quote! { DefinedLength::Rems(7.) }),
59        ("32", quote! { DefinedLength::Rems(8.) }),
60        ("36", quote! { DefinedLength::Rems(9.) }),
61        ("40", quote! { DefinedLength::Rems(10.) }),
62        ("44", quote! { DefinedLength::Rems(11.) }),
63        ("48", quote! { DefinedLength::Rems(12.) }),
64        ("52", quote! { DefinedLength::Rems(13.) }),
65        ("56", quote! { DefinedLength::Rems(14.) }),
66        ("60", quote! { DefinedLength::Rems(15.) }),
67        ("64", quote! { DefinedLength::Rems(16.) }),
68        ("72", quote! { DefinedLength::Rems(18.) }),
69        ("80", quote! { DefinedLength::Rems(20.) }),
70        ("96", quote! { DefinedLength::Rems(24.) }),
71        ("half", quote! { DefinedLength::Percent(50.) }),
72        ("1_3rd", quote! { DefinedLength::Percent(33.333333) }),
73        ("2_3rd", quote! { DefinedLength::Percent(66.666667) }),
74        ("1_4th", quote! { DefinedLength::Percent(25.) }),
75        ("2_4th", quote! { DefinedLength::Percent(50.) }),
76        ("3_4th", quote! { DefinedLength::Percent(75.) }),
77        ("1_5th", quote! { DefinedLength::Percent(20.) }),
78        ("2_5th", quote! { DefinedLength::Percent(40.) }),
79        ("3_5th", quote! { DefinedLength::Percent(60.) }),
80        ("4_5th", quote! { DefinedLength::Percent(80.) }),
81        ("1_6th", quote! { DefinedLength::Percent(16.666667) }),
82        ("2_6th", quote! { DefinedLength::Percent(33.333333) }),
83        ("3_6th", quote! { DefinedLength::Percent(50.) }),
84        ("4_6th", quote! { DefinedLength::Percent(66.666667) }),
85        ("5_6th", quote! { DefinedLength::Percent(83.333333) }),
86        ("1_12th", quote! { DefinedLength::Percent(8.333333) }),
87        ("2_12th", quote! { DefinedLength::Percent(16.666667) }),
88        ("3_12th", quote! { DefinedLength::Percent(25.) }),
89        ("4_12th", quote! { DefinedLength::Percent(33.333333) }),
90        ("5_12th", quote! { DefinedLength::Percent(41.666667) }),
91        ("6_12th", quote! { DefinedLength::Percent(50.) }),
92        ("7_12th", quote! { DefinedLength::Percent(58.333333) }),
93        ("8_12th", quote! { DefinedLength::Percent(66.666667) }),
94        ("9_12th", quote! { DefinedLength::Percent(75.) }),
95        ("10_12th", quote! { DefinedLength::Percent(83.333333) }),
96        ("11_12th", quote! { DefinedLength::Percent(91.666667) }),
97        ("full", quote! { DefinedLength::Percent(100.) }),
98    ]
99}