From f0d2b1c50c292859b47653eb12229e4f29010cef Mon Sep 17 00:00:00 2001 From: timando Date: Fri, 26 Nov 2021 07:42:25 +1000 Subject: [PATCH] Add support for rust_decimal and bigdecimal (#101) --- schemars/Cargo.toml | 2 ++ schemars/src/json_schema_impls/decimal.rs | 31 +++++++++++++++++++++++ schemars/src/json_schema_impls/mod.rs | 2 ++ 3 files changed, 35 insertions(+) create mode 100644 schemars/src/json_schema_impls/decimal.rs diff --git a/schemars/Cargo.toml b/schemars/Cargo.toml index 993f1263..013c0d64 100644 --- a/schemars/Cargo.toml +++ b/schemars/Cargo.toml @@ -26,6 +26,8 @@ smallvec = { version = "1.0", optional = true } arrayvec = { version = "0.5", default-features = false, optional = true } url = { version = "2.0", default-features = false, optional = true } bytes = { version = "1.0", optional = true } +rust_decimal = { version = "1", default-features = false, optional = true } +bigdecimal = { version = "0.3", default-features = false, optional = true } enumset = { version = "1.0", optional = true } [dev-dependencies] diff --git a/schemars/src/json_schema_impls/decimal.rs b/schemars/src/json_schema_impls/decimal.rs new file mode 100644 index 00000000..6058a7fd --- /dev/null +++ b/schemars/src/json_schema_impls/decimal.rs @@ -0,0 +1,31 @@ +use crate::gen::SchemaGenerator; +use crate::schema::*; +use crate::JsonSchema; + +macro_rules! decimal_impl { + ($type:ty) => { + decimal_impl!($type => Number, "Number"); + }; + ($type:ty => $instance_type:ident, $name:expr) => { + impl JsonSchema for $type { + no_ref_schema!(); + + fn schema_name() -> String { + $name.to_owned() + } + + fn json_schema(_: &mut SchemaGenerator) -> Schema { + SchemaObject { + instance_type: Some(InstanceType::$instance_type.into()), + ..Default::default() + } + .into() + } + } + }; +} + +#[cfg(feature="rust_decimal")] +decimal_impl!(rust_decimal::Decimal); +#[cfg(feature="bigdecimal")] +decimal_impl!(bigdecimal::BigDecimal); diff --git a/schemars/src/json_schema_impls/mod.rs b/schemars/src/json_schema_impls/mod.rs index d9c81c85..950f0f7c 100644 --- a/schemars/src/json_schema_impls/mod.rs +++ b/schemars/src/json_schema_impls/mod.rs @@ -45,6 +45,8 @@ mod bytes; #[cfg(feature = "chrono")] mod chrono; mod core; +#[cfg(any(feature = "rust_decimal", feature="bigdecimal"))] +mod decimal; #[cfg(feature = "either")] mod either; #[cfg(feature = "enumset")]