GraphiteEditor/Graphite · error · syn::Error

Tried to derive a discriminant for non-enum

Error message

Tried to derive a discriminant for non-enum

What it means

The Discriminant derive (proc-macros/src/discriminant.rs, generating ToDiscriminant impls with #[sub_discriminant] support) rejects any DeriveInput whose data is not Data::Enum. On a struct or union it returns this spanned compile-time error before generating anything.

Source

Thrown at proc-macros/src/discriminant.rs:11

use crate::helpers::call_site_ident;
use proc_macro2::{Ident, Span, TokenStream};
use syn::spanned::Spanned;
use syn::{Attribute, Data, DeriveInput, Field, Fields, ItemEnum, MetaList};

pub fn derive_discriminant_impl(input_item: TokenStream) -> syn::Result<TokenStream> {
	let input = syn::parse2::<DeriveInput>(input_item).unwrap();

	let mut data = match input.data {
		Data::Enum(data) => data,
		_ => return Err(syn::Error::new(Span::call_site(), "Tried to derive a discriminant for non-enum")),
	};

	let mut is_sub_discriminant = vec![];
	let mut attr_errs = vec![];

	for var in &mut data.variants {
		if var.attrs.iter().any(|a| a.path().is_ident("sub_discriminant")) {
			match var.fields.len() {
				1 => {
					let Field { ty, .. } = var.fields.iter_mut().next().unwrap();
					*ty = syn::parse_quote! {
						<#ty as ToDiscriminant>::Discriminant
					};
					is_sub_discriminant.push(true);
				}
				n => unimplemented!("#[sub_discriminant] on variants with {n} fields is not supported (for now)"),
			}
		} else {

View on GitHub (pinned to c507b35645)

Solutions

  1. Move the Discriminant derive onto an enum
  2. Restructure the type as an enum (optionally with single-field #[sub_discriminant] variants)
  3. Hand-implement ToDiscriminant if the struct must stay a struct

Example fix

// before
#[derive(Discriminant)]
struct MyStruct;

// after
#[derive(Discriminant)]
enum MyEnum {
	A,
	B,
}
Defensive patterns

Strategy: validation

Prevention

When it happens

Trigger: #[derive(Discriminant)] on a struct or union; routing the derive entry point at a non-enum item.

Common situations: Restructuring a discriminated enum into a struct during refactoring; applying the wrong derive from IDE completion to a struct type.

Related errors


AI-assisted analysis of GraphiteEditor/Graphite@c507b35645 (2026-08-16). Data as JSON: /api/errors/b96ea299a0478e8f. Report an issue: GitHub.