use serde::{Deserialize, Serialize}; #[derive(Debug, Deserialize, Serialize)] struct Struct { enser_1: Vec>, enser_2: Vec>, enser_3: Vec>, enser_4: Vec>, } trait Trait {} impl Trait for u8 {} impl Trait for u16 {} // No trait bounds #[enser::enser] #[derive(Clone, Debug, Deserialize, Serialize)] enum Enser1 { None, Some(T), Named { value: U }, } // Trait bounds without Clone #[enser::enser] #[derive(Clone, Debug, Deserialize, Serialize)] enum Enser2 where T: Trait, { None, Some(T), Named { value: U }, } // Trait bounds with Clone #[enser::enser] #[derive(Clone, Debug, Deserialize, Serialize)] enum Enser3 where T: Trait + Clone, U: Trait + Clone, { None, Some(T), Named { value: U }, } // Multiple trait bounds without Clone #[enser::enser] #[derive(Clone, Debug, Deserialize, Serialize)] enum Enser4 where T: Trait, T: 'static, { None, Some(T), Named { value: U }, } impl std::fmt::Display for Enser4 where // Note: These require T and U to be `Clone`, which are // added by the proc macro to the original enum. T: Clone + std::fmt::Display + Trait, U: Clone + std::fmt::Display, { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::None => "None".fmt(f), Self::Some(t) => t.fmt(f), Self::Named { value } => value.fmt(f), } } } fn main() { let s = Struct { enser_1: vec![ Enser1::None, Enser1::Some(123), Enser1::Named { value: 456 }, ], enser_2: vec![ Enser2::None, Enser2::Some(123), Enser2::Named { value: 456 }, ], enser_3: vec![ Enser3::None, Enser3::Some(123), Enser3::Named { value: 456 }, ], enser_4: vec![ Enser4::None, Enser4::Some(123), Enser4::Named { value: 456 }, ], }; let yaml = serde_yaml::to_string(&s).unwrap(); println!("{yaml}"); let json = serde_json::to_string_pretty(&s) .unwrap() .replace("\n {\n ", "\n { ") .replace("\n \"", " \"") .replace("\n }", " }") .replace("\n }", " }"); println!("{json}"); // Output: // // ```yaml // enser_1: // - None // - !Some 123 // - !Named // value: 456 // // { // "enser_1": [ // "None", // { "Some": 123 }, // { "Named": { "value": 456 } } // ] // } // ``` }