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,
}