1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
extern crate serde; use self::serde::{ser, Serialize, Serializer}; #[derive(Debug)] pub struct Union<T0, T1>(pub Option<T0>, pub Option<T1>); impl<T0, T1> Union<T0, T1> { pub fn for0(value: T0) -> Self { Union(Some(value), None) } pub fn for1(value: T1) -> Self { Union(None, Some(value)) } } impl<T0, T1> Serialize for Union<T0, T1> where T0: Serialize, T1: Serialize, { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { if let Some(value) = &self.0 { serializer.serialize_some::<T0>(value) } else if let Some(value) = &self.1 { serializer.serialize_some::<T1>(value) } else { Err(ser::Error::custom("invalid union")) } } } #[derive(Debug)] pub struct Union3<T0, T1, T2>(pub Option<T0>, pub Option<T1>, pub Option<T2>); impl<T0, T1, T2> Union3<T0, T1, T2> { pub fn for0(value: T0) -> Self { Union3(Some(value), None, None) } pub fn for1(value: T1) -> Self { Union3(None, Some(value), None) } pub fn for2(value: T2) -> Self { Union3(None, None, Some(value)) } } impl<T0, T1, T2> Serialize for Union3<T0, T1, T2> where T0: Serialize, T1: Serialize, T2: Serialize, { fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer, { if let Some(value) = &self.0 { serializer.serialize_some::<T0>(value) } else if let Some(value) = &self.1 { serializer.serialize_some::<T1>(value) } else if let Some(value) = &self.2 { serializer.serialize_some::<T2>(value) } else { Err(ser::Error::custom("invalid union")) } } }