swc-project/swc · error

#[derive(FromVariant)] only works for an enum.

Error message

#[derive(FromVariant)] only works for an enum.

What it means

Compile-time panic from `#[derive(FromVariant)]` (crates/from_variant). The macro generates `From<T>` impls that wrap each variant payload (`Enum::Variant(v)`), which only makes sense for enums; applying it to a struct or union hits `panic!("#[derive(FromVariant)] only works for an enum.")` when matching on `input.data`.

Source

Thrown at crates/from_variant/src/lib.rs:47

                is_unknown |= meta.path.is_ident("ignore");
                Ok(())
            })
            .unwrap();
            is_unknown
        })
}

fn derive(
    DeriveInput {
        generics,
        data,
        ident,
        ..
    }: DeriveInput,
) -> Vec<ItemImpl> {
    let variants = match data {
        Data::Enum(DataEnum { variants, .. }) => variants,
        _ => panic!("#[derive(FromVariant)] only works for an enum."),
    };

    let mut from_impls: Vec<ItemImpl> = Vec::new();

    for v in variants {
        if is_ignored(&v.attrs) {
            continue;
        }

        let variant_name = v.ident;
        match v.fields {
            Fields::Unnamed(FieldsUnnamed { unnamed, .. }) => {
                if unnamed.len() != 1 {
                    panic!(
                        "#[derive(FromVariant)] requires all variants to be tuple with exactly \
                         one field"
                    )
                }

View on GitHub (pinned to 5176682b65)

Solutions

  1. Move the payload types into enum variants and derive on the enum
  2. Or drop the derive and write the `impl From<T> for X` conversions manually for a struct

Example fix

// before
#[derive(FromVariant)]
struct Wrapper {
    inner: Expr,
}

// after
#[derive(FromVariant)]
enum Wrapper {
    Expr(Expr),
}
Defensive patterns

Strategy: validation

Prevention

When it happens

Trigger: `#[derive(FromVariant)]` on a struct or union item.

Common situations: Accidentally deriving FromVariant on wrapper structs while refactoring variant types out of an enum; copy-pasting derive lists between items.

Related errors


AI-assisted analysis of swc-project/swc@5176682b65 (2026-08-17). Data as JSON: /api/errors/d8fe1e448a4e5d93. Report an issue: GitHub.