How to Serialize Enums with Serde (Tagged, Untagged, etc.)

Use Serde attributes like `#[serde(tag)]` or `#[serde(untagged)]` to define how Rust enums serialize to JSON.

Use Serde's #[serde(tag = "...")] attribute on your enum to control how variants are serialized, or #[serde(untagged)] to omit the variant name entirely. For the Mode enum in your config, apply #[serde(tag = "mode")] to produce a JSON object with a discriminator field, or #[serde(untagged)] to serialize it as a simple string.

use serde::{Deserialize, Serialize};

#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[serde(tag = "mode")] // Produces: { "mode": "default" }
pub enum Mode {
    #[default]
    Default,
    Simple,
}

If you need the variant to serialize as just the string value (e.g., "default"), use untagged instead:

#[derive(Debug, Default, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[serde(untagged)] // Produces: "default"
pub enum Mode {
    #[default]
    Default,
    Simple,
}