Home / Function/ classify_bytes_derive() — tailwindcss Function Reference

classify_bytes_derive() — tailwindcss Function Reference

Architecture documentation for the classify_bytes_derive() function in lib.rs from the tailwindcss codebase.

Entity Profile

Dependency Diagram

graph TD
  35339c59_c350_38a5_aa44_e6d224d7e0e0["classify_bytes_derive()"]
  b8828b41_ff6f_bd1d_8645_341d50421c63["lib.rs"]
  35339c59_c350_38a5_aa44_e6d224d7e0e0 -->|defined in| b8828b41_ff6f_bd1d_8645_341d50421c63
  c7141349_0833_df1d_0452_b5037eec5157["has_fallback_attr()"]
  35339c59_c350_38a5_aa44_e6d224d7e0e0 -->|calls| c7141349_0833_df1d_0452_b5037eec5157
  d6a2ba66_f71f_0909_a1ac_b772f5abfeb9["get_bytes_attrs()"]
  35339c59_c350_38a5_aa44_e6d224d7e0e0 -->|calls| d6a2ba66_f71f_0909_a1ac_b772f5abfeb9
  55d99b77_f331_de66_a9c3_e6cdbc8312b5["get_bytes_range_attrs()"]
  35339c59_c350_38a5_aa44_e6d224d7e0e0 -->|calls| 55d99b77_f331_de66_a9c3_e6cdbc8312b5
  style 35339c59_c350_38a5_aa44_e6d224d7e0e0 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

crates/classification-macros/src/lib.rs lines 33–119

pub fn classify_bytes_derive(input: TokenStream) -> TokenStream {
    let ast = parse_macro_input!(input as DeriveInput);

    // This derive only works on an enum
    let Data::Enum(DataEnum { variants, .. }) = &ast.data else {
        return syn::Error::new_spanned(
            &ast.ident,
            "ClassifyBytes can only be derived on an enum.",
        )
        .to_compile_error()
        .into();
    };

    let enum_name = &ast.ident;

    let mut byte_map: [Option<Ident>; 256] = [const { None }; 256];
    let mut fallback_variant: Option<Ident> = None;

    // Start parsing the variants
    for variant in variants {
        let variant_ident = &variant.ident;

        // If this variant has #[fallback], record it
        if has_fallback_attr(variant) {
            if fallback_variant.is_some() {
                let err = syn::Error::new_spanned(
                    variant_ident,
                    "Multiple variants have #[fallback]. Only one allowed.",
                );
                return err.to_compile_error().into();
            }
            fallback_variant = Some(variant_ident.clone());
        }

        // Get #[bytes(…)]
        let single_bytes = get_bytes_attrs(&variant.attrs);

        // Get #[bytes_range(…)]
        let range_bytes = get_bytes_range_attrs(&variant.attrs);

        // Combine them
        let all_bytes = single_bytes
            .into_iter()
            .chain(range_bytes)
            .collect::<Vec<_>>();

        // Mark them in the table
        for b in all_bytes {
            byte_map[b as usize] = Some(variant_ident.clone());
        }
    }

    // If no fallback variant is found, default to "Other"
    let fallback_ident = fallback_variant.expect("A variant marked with #[fallback] is missing");

    // For each of the 256 byte values, fill the table
    let fill = byte_map
        .clone()
        .into_iter()
        .map(|variant_opt| match variant_opt {
            Some(ident) => quote!(#enum_name::#ident),
            None => quote!(#enum_name::#fallback_ident),
        });

    // Generate the final expanded code
    let expanded = quote! {
        impl #enum_name {
            pub const TABLE: [#enum_name; 256] = [
                #(#fill),*
            ];
        }

        impl From<u8> for #enum_name {
            fn from(byte: u8) -> Self {
                #enum_name::TABLE[byte as usize]
            }
        }

        impl From<&u8> for #enum_name {
            fn from(byte: &u8) -> Self {
                #enum_name::TABLE[*byte as usize]

Domain

Subdomains

Frequently Asked Questions

What does classify_bytes_derive() do?
classify_bytes_derive() is a function in the tailwindcss codebase, defined in crates/classification-macros/src/lib.rs.
Where is classify_bytes_derive() defined?
classify_bytes_derive() is defined in crates/classification-macros/src/lib.rs at line 33.
What does classify_bytes_derive() call?
classify_bytes_derive() calls 3 function(s): get_bytes_attrs, get_bytes_range_attrs, has_fallback_attr.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free