From d059686da8ebe963988ee4e4ff5b08da0e5950f4 Mon Sep 17 00:00:00 2001 From: Matt Campbell Date: Sun, 18 Jul 2021 18:45:25 -0500 Subject: [PATCH] Implement JsonSchema on EnumSet type --- .github/workflows/ci.yml | 2 +- README.md | 1 + docs/4-features.md | 1 + schemars/Cargo.toml | 5 +++++ schemars/src/json_schema_impls/enumset.rs | 6 ++++++ schemars/src/json_schema_impls/mod.rs | 2 ++ schemars/src/lib.rs | 1 + schemars/tests/enumset.rs | 15 +++++++++++++++ schemars/tests/expected/enumset.json | 18 ++++++++++++++++++ 9 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 schemars/src/json_schema_impls/enumset.rs create mode 100644 schemars/tests/enumset.rs create mode 100644 schemars/tests/expected/enumset.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 90f4f72..b27b983 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,7 +15,7 @@ jobs: include: - rust: 1.37.0 # exclude ui_test as the output is slightly different in rustc 1.37 - test_features: "--features impl_json_schema,chrono,indexmap,either,uuid,smallvec,arrayvec" + test_features: "--features impl_json_schema,chrono,indexmap,either,uuid,smallvec,arrayvec,enumset" allow_failure: false - rust: stable test_features: "--all-features" diff --git a/README.md b/README.md index 571045d..f5cafb9 100644 --- a/README.md +++ b/README.md @@ -274,3 +274,4 @@ Schemars can implement `JsonSchema` on types from several popular crates, enable - [`arrayvec`](https://crates.io/crates/arrayvec) (^0.5) - [`url`](https://crates.io/crates/url) (^2.0) - [`bytes`](https://crates.io/crates/bytes) (^1.0) +- [`enumset`](https://crates.io/crates/enumset) (^1.0) diff --git a/docs/4-features.md b/docs/4-features.md index d080908..613d352 100644 --- a/docs/4-features.md +++ b/docs/4-features.md @@ -28,3 +28,4 @@ Schemars can implement `JsonSchema` on types from several popular crates, enable - [`arrayvec`](https://crates.io/crates/arrayvec) (^0.5) - [`url`](https://crates.io/crates/url) (^2.0) - [`bytes`](https://crates.io/crates/bytes) (^1.0) +- [`enumset`](https://crates.io/crates/enumset) (^1.0) diff --git a/schemars/Cargo.toml b/schemars/Cargo.toml index 53a6584..c7b8bff 100644 --- a/schemars/Cargo.toml +++ b/schemars/Cargo.toml @@ -26,6 +26,7 @@ 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 } +enumset = { version = "1.0", optional = true } [dev-dependencies] pretty_assertions = "0.6.1" @@ -87,5 +88,9 @@ required-features = ["ui_test"] name = "url" required-features = ["url"] +[[test]] +name = "enumset" +required-features = ["enumset"] + [package.metadata.docs.rs] all-features = true diff --git a/schemars/src/json_schema_impls/enumset.rs b/schemars/src/json_schema_impls/enumset.rs new file mode 100644 index 0000000..22a3ebc --- /dev/null +++ b/schemars/src/json_schema_impls/enumset.rs @@ -0,0 +1,6 @@ +use crate::gen::SchemaGenerator; +use crate::schema::*; +use crate::JsonSchema; +use enumset::{EnumSet, EnumSetType}; + +forward_impl!(( JsonSchema for EnumSet where T: EnumSetType + JsonSchema) => std::collections::BTreeSet); diff --git a/schemars/src/json_schema_impls/mod.rs b/schemars/src/json_schema_impls/mod.rs index ff2e1e7..d9c81c8 100644 --- a/schemars/src/json_schema_impls/mod.rs +++ b/schemars/src/json_schema_impls/mod.rs @@ -47,6 +47,8 @@ mod chrono; mod core; #[cfg(feature = "either")] mod either; +#[cfg(feature = "enumset")] +mod enumset; mod ffi; #[cfg(feature = "indexmap")] mod indexmap; diff --git a/schemars/src/lib.rs b/schemars/src/lib.rs index e400ccf..d62f1d3 100644 --- a/schemars/src/lib.rs +++ b/schemars/src/lib.rs @@ -269,6 +269,7 @@ Schemars can implement `JsonSchema` on types from several popular crates, enable - [`arrayvec`](https://crates.io/crates/arrayvec) (^0.5) - [`url`](https://crates.io/crates/url) (^2.0) - [`bytes`](https://crates.io/crates/bytes) (^1.0) +- [`enumset`](https://crates.io/crates/enumset) (^1.0) */ /// The map type used by schemars types. diff --git a/schemars/tests/enumset.rs b/schemars/tests/enumset.rs new file mode 100644 index 0000000..27f2030 --- /dev/null +++ b/schemars/tests/enumset.rs @@ -0,0 +1,15 @@ +mod util; +use enumset::{EnumSet, EnumSetType}; +use schemars::JsonSchema; +use util::*; + +#[derive(EnumSetType, JsonSchema)] +enum Foo { + Bar, + Baz, +} + +#[test] +fn enumset() -> TestResult { + test_default_generated_schema::>("enumset") +} diff --git a/schemars/tests/expected/enumset.json b/schemars/tests/expected/enumset.json new file mode 100644 index 0000000..4950c93 --- /dev/null +++ b/schemars/tests/expected/enumset.json @@ -0,0 +1,18 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Set_of_Foo", + "type": "array", + "items": { + "$ref": "#/definitions/Foo" + }, + "uniqueItems": true, + "definitions": { + "Foo": { + "type": "string", + "enum": [ + "Bar", + "Baz" + ] + } + } +}