diff --git a/Cargo.lock b/Cargo.lock index 7f4d44b6..fdf14f21 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -355,6 +355,12 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "either" version = "1.18.0" @@ -757,6 +763,26 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.4", +] + [[package]] name = "regex" version = "1.13.1" @@ -810,6 +836,18 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schemars" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab508826f74a77ca9d5aba6ff19b522583ee3eaf28a19384ff3d0e5835fadf6e" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "semver" version = "1.0.28" @@ -896,6 +934,7 @@ dependencies = [ "malloc_size_of", "proptest", "rayon", + "schemars", "serde_core", "serde_test", "smallvec-macro", diff --git a/Cargo.toml b/Cargo.toml index 700c58cc..00a4abe2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,6 +32,7 @@ malloc-size-of = ["dep:malloc_size_of"] may-dangle = [] proptest = ["dep:proptest", "std"] rayon = ["dep:rayon", "std"] +schemars = ["dep:schemars", "std"] serde = ["dep:serde_core"] specialization = [] std = [] @@ -54,6 +55,7 @@ proptest = { version = "1", optional = true, features = [ "std", ], default-features = false } rayon = { version = "1", optional = true, default-features = false } +schemars = { version = "1", optional = true, default-features = false } serde_core = { version = "1", optional = true, default-features = false } smallvec-macro = { version = "0.0.0", path = "./macro", default-features = false } zeroize = { version = "1", optional = true, default-features = false } @@ -91,6 +93,10 @@ required-features = ["may-dangle"] name = "rayon" required-features = ["rayon"] +[[test]] +name = "schemars" +required-features = ["schemars"] + [[test]] name = "serde" required-features = ["serde"] diff --git a/src/lib.rs b/src/lib.rs index ed936c6f..13ad6bed 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -79,6 +79,15 @@ use std::io::{ }; #[cfg(feature = "zeroize")] use zeroize::Zeroize; +#[cfg(feature = "schemars")] +use { + alloc::borrow::Cow, + schemars::{ + JsonSchema, + Schema, + SchemaGenerator + } +}; use { allocator::{ Allocator, @@ -1973,3 +1982,25 @@ impl_rts_array!( (T, const INLINE: usize, Heap: Allocator); using len truncate ); + +#[cfg(feature = "schemars")] +#[cfg_attr(docsrs, doc(cfg(feature = "scheamrs")))] +impl JsonSchema + for SmallVec +{ + fn inline_schema() -> bool { + as JsonSchema>::inline_schema() + } + + fn schema_name() -> Cow<'static, str> { + as JsonSchema>::schema_name() + } + + fn schema_id() -> Cow<'static, str> { + as JsonSchema>::schema_id() + } + + fn json_schema(generator: &mut SchemaGenerator) -> Schema { + as JsonSchema>::json_schema(generator) + } +} diff --git a/tests/macro.rs b/tests/macro.rs index 24074fa4..06d52032 100644 --- a/tests/macro.rs +++ b/tests/macro.rs @@ -5,6 +5,10 @@ use smallvec::{ smallvec }; +fn check_eq(a: &T, b: &T) { + assert_eq!(a, b); +} + #[test] fn smallvec() { let mut vec: SmallVec; @@ -12,7 +16,7 @@ fn smallvec() { macro_rules! check { ($init:tt) => { vec = smallvec! $init; - assert_eq!(*vec, *vec! $init); + check_eq(&*vec, &*vec! $init); } } diff --git a/tests/schemars.rs b/tests/schemars.rs new file mode 100644 index 00000000..3f8d9cbc --- /dev/null +++ b/tests/schemars.rs @@ -0,0 +1,10 @@ +#![cfg(feature = "schemars")] +use { + schemars::schema_for, + smallvec::SmallVec +}; + +#[test] +fn schema_matches_vec() { + assert_eq!(schema_for!(SmallVec), schema_for!(Vec)); +}