Implement JsonSchema on EnumSet type

This commit is contained in:
Matt Campbell 2021-07-18 18:45:25 -05:00 committed by Graham Esau
parent 515a87a564
commit d059686da8
9 changed files with 50 additions and 1 deletions

View file

@ -15,7 +15,7 @@ jobs:
include: include:
- rust: 1.37.0 - rust: 1.37.0
# exclude ui_test as the output is slightly different in rustc 1.37 # 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 allow_failure: false
- rust: stable - rust: stable
test_features: "--all-features" test_features: "--all-features"

View file

@ -274,3 +274,4 @@ Schemars can implement `JsonSchema` on types from several popular crates, enable
- [`arrayvec`](https://crates.io/crates/arrayvec) (^0.5) - [`arrayvec`](https://crates.io/crates/arrayvec) (^0.5)
- [`url`](https://crates.io/crates/url) (^2.0) - [`url`](https://crates.io/crates/url) (^2.0)
- [`bytes`](https://crates.io/crates/bytes) (^1.0) - [`bytes`](https://crates.io/crates/bytes) (^1.0)
- [`enumset`](https://crates.io/crates/enumset) (^1.0)

View file

@ -28,3 +28,4 @@ Schemars can implement `JsonSchema` on types from several popular crates, enable
- [`arrayvec`](https://crates.io/crates/arrayvec) (^0.5) - [`arrayvec`](https://crates.io/crates/arrayvec) (^0.5)
- [`url`](https://crates.io/crates/url) (^2.0) - [`url`](https://crates.io/crates/url) (^2.0)
- [`bytes`](https://crates.io/crates/bytes) (^1.0) - [`bytes`](https://crates.io/crates/bytes) (^1.0)
- [`enumset`](https://crates.io/crates/enumset) (^1.0)

View file

@ -26,6 +26,7 @@ smallvec = { version = "1.0", optional = true }
arrayvec = { version = "0.5", default-features = false, optional = true } arrayvec = { version = "0.5", default-features = false, optional = true }
url = { version = "2.0", default-features = false, optional = true } url = { version = "2.0", default-features = false, optional = true }
bytes = { version = "1.0", optional = true } bytes = { version = "1.0", optional = true }
enumset = { version = "1.0", optional = true }
[dev-dependencies] [dev-dependencies]
pretty_assertions = "0.6.1" pretty_assertions = "0.6.1"
@ -87,5 +88,9 @@ required-features = ["ui_test"]
name = "url" name = "url"
required-features = ["url"] required-features = ["url"]
[[test]]
name = "enumset"
required-features = ["enumset"]
[package.metadata.docs.rs] [package.metadata.docs.rs]
all-features = true all-features = true

View file

@ -0,0 +1,6 @@
use crate::gen::SchemaGenerator;
use crate::schema::*;
use crate::JsonSchema;
use enumset::{EnumSet, EnumSetType};
forward_impl!((<T> JsonSchema for EnumSet<T> where T: EnumSetType + JsonSchema) => std::collections::BTreeSet<T>);

View file

@ -47,6 +47,8 @@ mod chrono;
mod core; mod core;
#[cfg(feature = "either")] #[cfg(feature = "either")]
mod either; mod either;
#[cfg(feature = "enumset")]
mod enumset;
mod ffi; mod ffi;
#[cfg(feature = "indexmap")] #[cfg(feature = "indexmap")]
mod indexmap; mod indexmap;

View file

@ -269,6 +269,7 @@ Schemars can implement `JsonSchema` on types from several popular crates, enable
- [`arrayvec`](https://crates.io/crates/arrayvec) (^0.5) - [`arrayvec`](https://crates.io/crates/arrayvec) (^0.5)
- [`url`](https://crates.io/crates/url) (^2.0) - [`url`](https://crates.io/crates/url) (^2.0)
- [`bytes`](https://crates.io/crates/bytes) (^1.0) - [`bytes`](https://crates.io/crates/bytes) (^1.0)
- [`enumset`](https://crates.io/crates/enumset) (^1.0)
*/ */
/// The map type used by schemars types. /// The map type used by schemars types.

15
schemars/tests/enumset.rs Normal file
View file

@ -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<Foo>>("enumset")
}

View file

@ -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"
]
}
}
}