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")]