diff --git a/src/make_schema.rs b/src/make_schema.rs index 437918d..2b27308 100644 --- a/src/make_schema.rs +++ b/src/make_schema.rs @@ -8,19 +8,19 @@ pub trait MakeSchema { // TODO structs, enums, tuples -// TODO serde json value, any other serde values? +// TODO any other serde types other than serde_json value? // https://github.com/serde-rs/serde/blob/ce75418e40a593fc5c0902cbf4a45305a4178dd7/serde/src/ser/impls.rs // Cell, RefCell, Mutex, RwLock, Result?, Duration, SystemTime, // IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV6, SocketAddrV6, // Path, PathBuf, OsStr, OsString, Wrapping, Reverse, AtomicBool, AtomixI8 etc., -// NonZeroU8 etc., ArcWeak, RcWeak, BTreeMap, HashMap, unit?, (!)?, Bound?, Range?, RangeInclusive?, +// NonZeroU8 etc., ArcWeak, RcWeak, BTreeMap, HashMap, (!)?, Bound?, Range?, RangeInclusive?, // PhantomData?, CString?, CStr?, fmt::Arguments? // !map keys must be Into! ////////// PRIMITIVES (except ints) ////////// macro_rules! simple_impl { - ($type:ident => $instance_type:expr) => { + ($type:tt => $instance_type:expr) => { impl MakeSchema for $type { fn make_schema() -> Schema { Schema { @@ -37,6 +37,7 @@ simple_impl!(String => InstanceType::String); simple_impl!(bool => InstanceType::Boolean); simple_impl!(f32 => InstanceType::Number); simple_impl!(f64 => InstanceType::Number); +simple_impl!(() => InstanceType::Null); impl MakeSchema for char { fn make_schema() -> Schema { @@ -154,6 +155,35 @@ seq_impl!( MakeSchema for std::collections::LinkedList); seq_impl!( MakeSchema for Vec); seq_impl!( MakeSchema for std::collections::VecDeque); +////////// MAPS ///////// + +macro_rules! map_impl { + ($($desc:tt)+) => { + impl $($desc)+ + where + K: Into, + T: MakeSchema, + { + fn make_schema() -> Schema + { + let mut extra_properties = Map::new(); + extra_properties.insert( + "patternProperties".to_owned(), + json!({"": T::make_schema()}) + ); + Schema { + instance_type: Some(InstanceType::Object.into()), + extra_properties, + ..Default::default() + } + } + } + }; +} + +map_impl!( MakeSchema for std::collections::BTreeMap); +map_impl!( MakeSchema for std::collections::HashMap); + ////////// OPTION ////////// impl MakeSchema for Option { @@ -191,3 +221,11 @@ deref_impl!( MakeSchema for Box); deref_impl!( MakeSchema for std::rc::Rc); deref_impl!( MakeSchema for std::sync::Arc); deref_impl!(<'a, T: ToOwned> MakeSchema for std::borrow::Cow<'a, T>); + +////////// SERDE_JSON ////////// + +impl MakeSchema for serde_json::Value { + fn make_schema() -> Schema { + Schema::default() + } +} diff --git a/src/schema.rs b/src/schema.rs index f442f3a..436c257 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -51,13 +51,13 @@ pub enum SingleOrVec { Vec(Vec), } -impl From for SingleOrVec { +impl From for SingleOrVec { fn from(single: T) -> Self { SingleOrVec::Single(single) } } -impl From> for SingleOrVec { +impl From> for SingleOrVec { fn from(mut vec: Vec) -> Self { match vec.len() { 1 => SingleOrVec::Single(vec.remove(0)), @@ -66,7 +66,7 @@ impl From> for SingleOrVec { } } -impl Into> for SingleOrVec { +impl Into> for SingleOrVec { fn into(self) -> Vec { match self { SingleOrVec::Single(s) => vec![s],