mod simple_value { use serde::{Deserialize, Serialize}; use serde_dhall::{ from_str, serialize, FromDhall, NumKind, SimpleValue, ToDhall, }; fn assert_de(s: &str, x: T) where T: FromDhall + PartialEq + std::fmt::Debug, { assert_eq!(from_str(s).parse::().map_err(|e| e.to_string()), Ok(x)); } fn assert_ser(s: &str, x: T) where T: ToDhall + PartialEq + std::fmt::Debug, { assert_eq!( serialize(&x).to_string().map_err(|e| e.to_string()), Ok(s.to_string()) ); } fn assert_serde(s: &str, x: T) where T: ToDhall + FromDhall + PartialEq + std::fmt::Debug + Clone, { assert_de(s, x.clone()); assert_ser(s, x); } #[test] fn test_serde() { let bool_true = SimpleValue::Num(NumKind::Bool(true)); // https://github.com/Nadrieril/dhall-rust/issues/184 // assert_serde("[ True ]", vec![bool_true.clone()]); assert_de("< Foo >.Foo", SimpleValue::Union("Foo".into(), None)); assert_de( "< Foo: Bool >.Foo True", SimpleValue::Union("Foo".into(), Some(Box::new(bool_true.clone()))), ); // assert_eq!( // serialize(&SimpleValue::Optional(None)).to_string().map_err(|e| e.to_string()), // Err("cannot serialize value without a type annotation: Optional(None)".to_string()) // ); // #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] // struct Foo { // foo: SimpleValue, // } // assert_serde( // "{ foo = True }", // Foo { // foo: bool_true.clone(), // }, // ); } }