use serde::{Deserialize, Serialize}; fn d() -> T { unimplemented!() } #[derive(Deserialize, Serialize)] struct Unit; //////////////////////////////////////////////////////////////////////////////// #[derive(Deserialize, Serialize)] struct Tuple0(); #[derive(Deserialize, Serialize)] struct Tuple1(u8); #[derive(Deserialize, Serialize)] struct Tuple2(u8, u8); #[derive(Deserialize, Serialize)] struct Tuple1as0(#[serde(skip)] u8); #[derive(Deserialize, Serialize)] struct Tuple2as0(#[serde(skip)] u8, #[serde(skip)] u8); #[derive(Deserialize, Serialize)] struct Tuple2as1(#[serde(skip)] u8, u8); #[derive(Deserialize, Serialize)] struct Tuple1as0Default(#[serde(skip, default = "d")] u8); #[derive(Deserialize, Serialize)] struct Tuple2as0Default( #[serde(skip, default = "d")] u8, #[serde(skip, default = "d")] u8, ); #[derive(Deserialize, Serialize)] struct Tuple2as1Default(#[serde(skip, default = "d")] u8, #[serde(default = "d")] u8); //////////////////////////////////////////////////////////////////////////////// #[derive(Deserialize, Serialize)] struct Struct0 {} #[derive(Deserialize, Serialize)] struct Struct1 { a: u8, } #[derive(Deserialize, Serialize)] struct Struct2as0 { #[serde(skip)] a: u8, #[serde(skip)] b: u8, } #[derive(Deserialize, Serialize)] struct Struct2as1 { #[serde(skip)] a: u8, b: u8, } //////////////////////////////////////////////////////////////////////////////// #[derive(Deserialize, Serialize)] enum ExternallyTagged { Unit, Tuple0(), Tuple1(u8), Tuple2(u8, u8), Tuple1as0(#[serde(skip)] u8), Tuple2as0(#[serde(skip)] u8, #[serde(skip)] u8), Tuple2as1(#[serde(skip)] u8, u8), Tuple1as0Default(#[serde(skip, default = "d")] u8), Tuple2as0Default( #[serde(skip, default = "d")] u8, #[serde(skip, default = "d")] u8, ), Tuple2as1Default(#[serde(skip, default = "d")] u8, #[serde(default = "d")] u8), Struct0 {}, Struct1 { a: u8, }, Struct2as0 { #[serde(skip)] a: u8, #[serde(skip)] b: u8, }, Struct2as1 { #[serde(skip)] a: u8, b: u8, }, } //////////////////////////////////////////////////////////////////////////////// #[derive(Deserialize, Serialize)] #[serde(tag = "tag")] enum InternallyTagged { Unit, // Tuple0(), FIXME Tuple1(u8), // Tuple2(u8, u8), - not supported Tuple1as0(#[serde(skip)] u8), // Tuple2as0(#[serde(skip)] u8, #[serde(skip)] u8), FIXME // Tuple2as1(#[serde(skip)] u8, u8), FIXME Tuple1as0Default(#[serde(skip, default = "d")] u8), // Tuple2as0Default(#[serde(skip, default = "d")] u8, #[serde(skip, default = "d")] u8), FIXME // Tuple2as1Default(#[serde(skip, default = "d")] u8, #[serde(default = "d")] u8), FIXME Struct0 {}, Struct1 { a: u8, }, Struct2as0 { #[serde(skip)] a: u8, #[serde(skip)] b: u8, }, Struct2as1 { #[serde(skip)] a: u8, b: u8, }, } //////////////////////////////////////////////////////////////////////////////// #[derive(Deserialize, Serialize)] #[serde(tag = "tag", content = "content")] enum AdjacentlyTagged { Unit, Tuple0(), Tuple1(u8), Tuple2(u8, u8), Tuple1as0(#[serde(skip)] u8), Tuple2as0(#[serde(skip)] u8, #[serde(skip)] u8), Tuple2as1(#[serde(skip)] u8, u8), Tuple1as0Default(#[serde(skip, default = "d")] u8), Tuple2as0Default( #[serde(skip, default = "d")] u8, #[serde(skip, default = "d")] u8, ), Tuple2as1Default(#[serde(skip, default = "d")] u8, #[serde(default = "d")] u8), Struct0 {}, Struct1 { a: u8, }, Struct2as0 { #[serde(skip)] a: u8, #[serde(skip)] b: u8, }, Struct2as1 { #[serde(skip)] a: u8, b: u8, }, } //////////////////////////////////////////////////////////////////////////////// #[derive(Deserialize, Serialize)] #[serde(untagged)] enum Untagged { Unit, Tuple0(), Tuple1(u8), Tuple2(u8, u8), Tuple1as0(#[serde(skip)] u8), Tuple2as0(#[serde(skip)] u8, #[serde(skip)] u8), Tuple2as1(#[serde(skip)] u8, u8), Tuple1as0Default(#[serde(skip, default = "d")] u8), Tuple2as0Default( #[serde(skip, default = "d")] u8, #[serde(skip, default = "d")] u8, ), Tuple2as1Default(#[serde(skip, default = "d")] u8, #[serde(default = "d")] u8), Struct0 {}, Struct1 { a: u8, }, Struct2as0 { #[serde(skip)] a: u8, #[serde(skip)] b: u8, }, Struct2as1 { #[serde(skip)] a: u8, b: u8, }, }