schemafy_core-0.6.0/.cargo_vcs_info.json0000644000000001110000000000100136370ustar { "git": { "sha1": "67474df5e88cbf65490e90f894c73d71c7b3e021" } }schemafy_core-0.6.0/Cargo.toml0000644000000015410000000000100116450ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2018" name = "schemafy_core" version = "0.6.0" authors = ["Markus Westerlind "] description = "Generates serializeable Rust types from a json schema" documentation = "https://docs.rs/schemafy" license = "MIT" repository = "https://github.com/Marwes/schemafy" [dependencies.serde] version = "1" features = ["derive"] [dependencies.serde_json] version = "1" schemafy_core-0.6.0/Cargo.toml.orig000064400000000000000000000006160072674642500153600ustar 00000000000000[package] name = "schemafy_core" version = "0.6.0" # VERSION_TAG authors = ["Markus Westerlind "] edition = "2018" description = "Generates serializeable Rust types from a json schema" license = "MIT" repository = "https://github.com/Marwes/schemafy" documentation = "https://docs.rs/schemafy" [dependencies] serde = { version = "1", features = ["derive"] } serde_json = "1" schemafy_core-0.6.0/src/lib.rs000064400000000000000000000000270072674642500143700ustar 00000000000000pub mod one_or_many; schemafy_core-0.6.0/src/one_or_many.rs000064400000000000000000000077220072674642500161400ustar 00000000000000pub type OneOrMany = Vec; pub fn deserialize<'de, T, D>(deserializer: D) -> Result, D::Error> where T: serde::Deserialize<'de>, D: serde::Deserializer<'de>, { use std::fmt; use std::marker::PhantomData; use serde::de::value::{MapAccessDeserializer, SeqAccessDeserializer}; use serde::de::{self, Deserialize, IntoDeserializer}; struct OneOrManyDeserializer(PhantomData); impl<'de2, T> serde::de::Visitor<'de2> for OneOrManyDeserializer where T: Deserialize<'de2>, { type Value = Vec; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("one or many") } fn visit_i64(self, value: i64) -> Result, E> where E: de::Error, { Deserialize::deserialize(value.into_deserializer()).map(|v| vec![v]) } fn visit_u64(self, value: u64) -> Result, E> where E: de::Error, { Deserialize::deserialize(value.into_deserializer()).map(|v| vec![v]) } fn visit_str(self, value: &str) -> Result, E> where E: de::Error, { Deserialize::deserialize(value.into_deserializer()).map(|v| vec![v]) } fn visit_string(self, value: String) -> Result, E> where E: de::Error, { Deserialize::deserialize(value.into_deserializer()).map(|v| vec![v]) } fn visit_map(self, visitor: V) -> Result where V: serde::de::MapAccess<'de2>, { Deserialize::deserialize(MapAccessDeserializer::new(visitor)).map(|v| vec![v]) } fn visit_seq(self, visitor: V) -> Result where V: serde::de::SeqAccess<'de2>, { Deserialize::deserialize(SeqAccessDeserializer::new(visitor)) } } deserializer.deserialize_any(OneOrManyDeserializer(PhantomData::)) } pub fn serialize(value: &[T], serializer: S) -> Result where T: serde::Serialize, S: serde::Serializer, { use serde::Serialize; if value.len() == 1 { value[0].serialize(serializer) } else { value.serialize(serializer) } } #[cfg(test)] mod tests { use super::*; use serde::{Deserialize, Serialize}; use serde_json::from_str; #[derive(PartialEq, Debug, Deserialize, Serialize)] struct OneOrMany( #[serde(serialize_with = "serialize", deserialize_with = "deserialize")] Vec, ) where T: for<'de2> Deserialize<'de2> + Serialize; #[test] fn deserialize_one_int() { assert_eq!(from_str::>("1").unwrap(), OneOrMany(vec![1])); } #[test] fn deserialize_many_int() { assert_eq!( from_str::>("[1, 2, 3]").unwrap(), OneOrMany(vec![1, 2, 3]) ); } #[derive(Deserialize, Serialize, Debug, PartialEq)] struct Test { x: i32, y: Option, } #[test] fn deserialize_one_struct() { assert_eq!( from_str::>(r#"{ "x" : 10, "y" : "test" }"#).unwrap(), OneOrMany(vec![Test { x: 10, y: Some("test".to_string()), },]) ); } #[test] fn deserialize_one_struct_missing_field() { assert_eq!( from_str::>(r#"{ "x" : 10 }"#).unwrap(), OneOrMany(vec![Test { x: 10, y: None }]) ); } #[test] fn deserialize_many_struct() { assert_eq!( from_str::>(r#"[{ "x" : 10 }, { "x" : 0, "y" : "a" }]"#).unwrap(), OneOrMany(vec![ Test { x: 10, y: None }, Test { x: 0, y: Some("a".to_string()), }, ]) ); } }