use crate::{
map::ZeroMapKV,
ule::{AsULE, VarULE},
vecs::VarZeroVecFormat,
VarZeroVec, ZeroMap, ZeroSlice, ZeroVec,
};
use alloc::{borrow::Cow, format};
use schemars::JsonSchema;
impl<T: VarULE + JsonSchema + ?Sized, F: VarZeroVecFormat> JsonSchema for VarZeroVec<'_, T, F> {
fn inline_schema() -> bool {
true
}
fn schema_name() -> Cow<'static, str> {
format!("VarZeroVec<{}>", T::schema_name()).into()
}
fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
schemars::json_schema!({
"type": "array",
"items": generator.subschema_for::<T>(),
})
}
}
impl<'a, T: AsULE + JsonSchema> JsonSchema for ZeroVec<'a, T> {
fn inline_schema() -> bool {
true
}
fn schema_name() -> Cow<'static, str> {
alloc::format!("ZeroVec<{}>", T::schema_name()).into()
}
fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
schemars::json_schema!({
"type": "array",
"items": generator.subschema_for::<T>(),
})
}
}
impl<T: AsULE + JsonSchema> JsonSchema for ZeroSlice<T> {
fn inline_schema() -> bool {
true
}
fn schema_name() -> Cow<'static, str> {
format!("ZeroSlice<{}>", T::schema_name()).into()
}
fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
schemars::json_schema!({
"type": "array",
"items": generator.subschema_for::<T>(),
})
}
}
impl<'a, K, V> JsonSchema for ZeroMap<'a, K, V>
where
K: ZeroMapKV<'a> + ?Sized + JsonSchema,
V: ZeroMapKV<'a> + ?Sized + JsonSchema,
{
fn inline_schema() -> bool {
true
}
fn schema_name() -> Cow<'static, str> {
format!("ZeroMap<{}, {}>", K::schema_name(), V::schema_name()).into()
}
fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
<alloc::collections::BTreeMap<&K, &V> as JsonSchema>::json_schema(generator)
}
}
#[cfg(test)]
mod tests {
use crate::{VarZeroVec, ZeroMap, ZeroSlice, ZeroVec};
#[test]
#[cfg(feature = "schemars")]
fn schema_zerovec_u32() {
let generator = schemars::SchemaGenerator::default();
let schema = generator.into_root_schema_for::<ZeroVec<u32>>();
insta::assert_json_snapshot!(schema);
}
#[test]
#[cfg(feature = "schemars")]
fn schema_zerovec_char() {
let generator = schemars::SchemaGenerator::default();
let schema = generator.into_root_schema_for::<ZeroVec<char>>();
insta::assert_json_snapshot!(schema);
}
#[test]
#[cfg(feature = "schemars")]
fn schema_varzerovec_str() {
let generator = schemars::SchemaGenerator::default();
let schema = generator.into_root_schema_for::<VarZeroVec<str>>();
insta::assert_json_snapshot!(schema);
}
#[test]
#[cfg(feature = "schemars")]
fn schema_varzerovec_zeroslice() {
let generator = schemars::SchemaGenerator::default();
let schema = generator.into_root_schema_for::<VarZeroVec<ZeroSlice<u32>>>();
insta::assert_json_snapshot!(schema);
}
#[test]
fn schema_zeromap_u32_str() {
let generator = schemars::SchemaGenerator::default();
let schema = generator.into_root_schema_for::<ZeroMap<u32, str>>();
insta::assert_json_snapshot!(schema);
}
}