// These just test that serde_codegen is able to produce code that compiles // successfully when there are a variety of generics and non-(de)serializable // types involved. extern crate serde; use self::serde::ser::{Serialize, Serializer}; use self::serde::de::{Deserialize, Deserializer}; ////////////////////////////////////////////////////////////////////////// #[derive(Serialize, Deserialize)] struct With { t: T, #[serde(serialize_with="ser_x", deserialize_with="de_x")] x: X, } #[derive(Serialize, Deserialize)] struct WithRef<'a, T: 'a> { #[serde(skip_deserializing)] t: Option<&'a T>, #[serde(serialize_with="ser_x", deserialize_with="de_x")] x: X, } #[derive(Serialize, Deserialize)] struct Bounds { t: T, option: Option, boxed: Box, option_boxed: Option>, } #[derive(Serialize, Deserialize)] struct NoBounds { t: T, option: Option, boxed: Box, option_boxed: Option>, } #[derive(Serialize, Deserialize)] enum EnumWith { Unit, Newtype( #[serde(serialize_with="ser_x", deserialize_with="de_x")] X), Tuple( T, #[serde(serialize_with="ser_x", deserialize_with="de_x")] X), Struct { t: T, #[serde(serialize_with="ser_x", deserialize_with="de_x")] x: X }, } #[derive(Serialize)] #[allow(dead_code)] struct MultipleRef<'a, 'b, 'c, T> where T: 'c, 'c: 'b, 'b: 'a { t: T, rrrt: &'a &'b &'c T, } #[derive(Serialize, Deserialize)] struct Newtype( #[serde(serialize_with="ser_x", deserialize_with="de_x")] X ); #[derive(Serialize, Deserialize)] struct Tuple( T, #[serde(serialize_with="ser_x", deserialize_with="de_x")] X, ); #[derive(Serialize, Deserialize)] enum TreeNode { Split { left: Box>, right: Box>, }, Leaf { data: D, }, } #[derive(Serialize, Deserialize)] struct ListNode { data: D, next: Box>, } #[derive(Serialize, Deserialize)] #[serde(bound="D: SerializeWith + DeserializeWith")] struct WithTraits1 { #[serde(serialize_with="SerializeWith::serialize_with", deserialize_with="DeserializeWith::deserialize_with")] d: D, #[serde(serialize_with="SerializeWith::serialize_with", deserialize_with="DeserializeWith::deserialize_with", bound="E: SerializeWith + DeserializeWith")] e: E, } #[derive(Serialize, Deserialize)] #[serde(bound(serialize="D: SerializeWith", deserialize="D: DeserializeWith"))] struct WithTraits2 { #[serde(serialize_with="SerializeWith::serialize_with", deserialize_with="DeserializeWith::deserialize_with")] d: D, #[serde(serialize_with="SerializeWith::serialize_with", bound(serialize="E: SerializeWith"))] #[serde(deserialize_with="DeserializeWith::deserialize_with", bound(deserialize="E: DeserializeWith"))] e: E, } ////////////////////////////////////////////////////////////////////////// trait SerializeWith { fn serialize_with(_: &Self, _: &mut S) -> Result<(), S::Error>; } trait DeserializeWith: Sized { fn deserialize_with(_: &mut D) -> Result; } // Implements neither Serialize nor Deserialize struct X; fn ser_x(_: &X, _: &mut S) -> Result<(), S::Error> { panic!() } fn de_x(_: &mut D) -> Result { panic!() }