schemars

Trait JsonSchema

source
pub trait JsonSchema {
    // Required methods
    fn schema_name() -> String;
    fn json_schema(gen: &mut SchemaGenerator) -> Schema;

    // Provided methods
    fn is_referenceable() -> bool { ... }
    fn schema_id() -> Cow<'static, str> { ... }
}
Expand description

A type which can be described as a JSON Schema document.

This is implemented for many Rust primitive and standard library types.

This can also be automatically derived on most custom types with #[derive(JsonSchema)].

§Examples

Deriving an implementation:

use schemars::{schema_for, JsonSchema};

#[derive(JsonSchema)]
struct MyStruct {
    foo: i32,
}

let my_schema = schema_for!(MyStruct);

When manually implementing JsonSchema, as well as determining an appropriate schema, you will need to determine an appropriate name and ID for the type. For non-generic types, the type name/path are suitable for this:

use schemars::{gen::SchemaGenerator, schema::Schema, JsonSchema};
use std::borrow::Cow;

struct NonGenericType;

impl JsonSchema for NonGenericType {
    fn schema_name() -> String {
        // Exclude the module path to make the name in generated schemas clearer.
        "NonGenericType".to_owned()
    }

    fn schema_id() -> Cow<'static, str> {
        // Include the module, in case a type with the same name is in another module/crate
        Cow::Borrowed(concat!(module_path!(), "::NonGenericType"))
    }

    fn json_schema(_gen: &mut SchemaGenerator) -> Schema {
        todo!()
    }
}

assert_eq!(NonGenericType::schema_id(), <&mut NonGenericType>::schema_id());

But generic type parameters which may affect the generated schema should typically be included in the name/ID:

use schemars::{gen::SchemaGenerator, schema::Schema, JsonSchema};
use std::{borrow::Cow, marker::PhantomData};

struct GenericType<T>(PhantomData<T>);

impl<T: JsonSchema> JsonSchema for GenericType<T> {
    fn schema_name() -> String {
        format!("GenericType_{}", T::schema_name())
    }

    fn schema_id() -> Cow<'static, str> {
        Cow::Owned(format!(
            "{}::GenericType<{}>",
            module_path!(),
            T::schema_id()
        ))
    }

    fn json_schema(_gen: &mut SchemaGenerator) -> Schema {
        todo!()
    }
}

assert_eq!(<GenericType<i32>>::schema_id(), <&mut GenericType<&i32>>::schema_id());

Required Methods§

source

fn schema_name() -> String

The name of the generated JSON Schema.

This is used as the title for root schemas, and the key within the root’s definitions property for subschemas.

source

fn json_schema(gen: &mut SchemaGenerator) -> Schema

Generates a JSON Schema for this type.

If the returned schema depends on any referenceable schemas, then this method will add them to the SchemaGenerator’s schema definitions.

This should not return a $ref schema.

Provided Methods§

source

fn is_referenceable() -> bool

Whether JSON Schemas generated for this type should be re-used where possible using the $ref keyword.

For trivial types (such as primitives), this should return false. For more complex types, it should return true. For recursive types, this must return true to prevent infinite cycles when generating schemas.

By default, this returns true.

source

fn schema_id() -> Cow<'static, str>

Returns a string that uniquely identifies the schema produced by this type.

This does not have to be a human-readable string, and the value will not itself be included in generated schemas. If two types produce different schemas, then they must have different schema_id()s, but two types that produce identical schemas should ideally have the same schema_id().

The default implementation returns the same value as schema_name().

Object Safety§

This trait is not object safe.

Implementations on Foreign Types§

source§

impl JsonSchema for Value

source§

impl JsonSchema for IpAddr

source§

impl JsonSchema for SocketAddr

source§

impl JsonSchema for bool

source§

impl JsonSchema for char

source§

impl JsonSchema for f32

source§

impl JsonSchema for f64

source§

impl JsonSchema for i8

source§

impl JsonSchema for i16

source§

impl JsonSchema for i32

source§

impl JsonSchema for i64

source§

impl JsonSchema for i128

source§

impl JsonSchema for isize

source§

impl JsonSchema for str

source§

impl JsonSchema for u8

source§

impl JsonSchema for u16

source§

impl JsonSchema for u32

source§

impl JsonSchema for u64

source§

impl JsonSchema for u128

source§

impl JsonSchema for ()

source§

impl JsonSchema for usize

source§

impl JsonSchema for Map<String, Value>

source§

impl JsonSchema for Number

source§

impl JsonSchema for Uuid

source§

impl JsonSchema for CString

source§

impl JsonSchema for String

source§

impl JsonSchema for CStr

source§

impl JsonSchema for Ipv4Addr

source§

impl JsonSchema for Ipv6Addr

source§

impl JsonSchema for SocketAddrV4

source§

impl JsonSchema for SocketAddrV6

source§

impl JsonSchema for AtomicBool

source§

impl JsonSchema for AtomicI8

source§

impl JsonSchema for AtomicI16

source§

impl JsonSchema for AtomicI32

source§

impl JsonSchema for AtomicI64

source§

impl JsonSchema for AtomicIsize

source§

impl JsonSchema for AtomicU8

source§

impl JsonSchema for AtomicU16

source§

impl JsonSchema for AtomicU32

source§

impl JsonSchema for AtomicU64

source§

impl JsonSchema for AtomicUsize

source§

impl JsonSchema for Duration

source§

impl JsonSchema for OsStr

source§

impl JsonSchema for OsString

source§

impl JsonSchema for Path

source§

impl JsonSchema for PathBuf

source§

impl JsonSchema for SystemTime

source§

impl JsonSchema for NonZeroI8

source§

impl JsonSchema for NonZeroI16

source§

impl JsonSchema for NonZeroI32

source§

impl JsonSchema for NonZeroI64

source§

impl JsonSchema for NonZeroI128

source§

impl JsonSchema for NonZeroIsize

source§

impl JsonSchema for NonZeroU8

source§

impl JsonSchema for NonZeroU16

source§

impl JsonSchema for NonZeroU32

source§

impl JsonSchema for NonZeroU64

source§

impl JsonSchema for NonZeroU128

source§

impl JsonSchema for NonZeroUsize

source§

impl<'a> JsonSchema for Arguments<'a>

source§

impl<'a, T> JsonSchema for Cow<'a, T>
where T: JsonSchema + ?Sized + ToOwned,

source§

impl<'a, T> JsonSchema for &'a T
where T: JsonSchema + ?Sized,

source§

impl<'a, T> JsonSchema for &'a mut T
where T: JsonSchema + ?Sized,

source§

impl<K, V> JsonSchema for BTreeMap<K, V>
where V: JsonSchema,

source§

impl<K, V, H> JsonSchema for HashMap<K, V, H>
where V: JsonSchema,

source§

impl<T0: JsonSchema> JsonSchema for (T0,)

source§

impl<T0: JsonSchema, T1: JsonSchema> JsonSchema for (T0, T1)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema> JsonSchema for (T0, T1, T2)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema> JsonSchema for (T0, T1, T2, T3)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema, T4: JsonSchema> JsonSchema for (T0, T1, T2, T3, T4)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema, T4: JsonSchema, T5: JsonSchema> JsonSchema for (T0, T1, T2, T3, T4, T5)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema, T4: JsonSchema, T5: JsonSchema, T6: JsonSchema> JsonSchema for (T0, T1, T2, T3, T4, T5, T6)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema, T4: JsonSchema, T5: JsonSchema, T6: JsonSchema, T7: JsonSchema> JsonSchema for (T0, T1, T2, T3, T4, T5, T6, T7)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema, T4: JsonSchema, T5: JsonSchema, T6: JsonSchema, T7: JsonSchema, T8: JsonSchema> JsonSchema for (T0, T1, T2, T3, T4, T5, T6, T7, T8)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema, T4: JsonSchema, T5: JsonSchema, T6: JsonSchema, T7: JsonSchema, T8: JsonSchema, T9: JsonSchema> JsonSchema for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema, T4: JsonSchema, T5: JsonSchema, T6: JsonSchema, T7: JsonSchema, T8: JsonSchema, T9: JsonSchema, T10: JsonSchema> JsonSchema for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema, T4: JsonSchema, T5: JsonSchema, T6: JsonSchema, T7: JsonSchema, T8: JsonSchema, T9: JsonSchema, T10: JsonSchema, T11: JsonSchema> JsonSchema for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema, T4: JsonSchema, T5: JsonSchema, T6: JsonSchema, T7: JsonSchema, T8: JsonSchema, T9: JsonSchema, T10: JsonSchema, T11: JsonSchema, T12: JsonSchema> JsonSchema for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema, T4: JsonSchema, T5: JsonSchema, T6: JsonSchema, T7: JsonSchema, T8: JsonSchema, T9: JsonSchema, T10: JsonSchema, T11: JsonSchema, T12: JsonSchema, T13: JsonSchema> JsonSchema for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema, T4: JsonSchema, T5: JsonSchema, T6: JsonSchema, T7: JsonSchema, T8: JsonSchema, T9: JsonSchema, T10: JsonSchema, T11: JsonSchema, T12: JsonSchema, T13: JsonSchema, T14: JsonSchema> JsonSchema for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)

source§

impl<T0: JsonSchema, T1: JsonSchema, T2: JsonSchema, T3: JsonSchema, T4: JsonSchema, T5: JsonSchema, T6: JsonSchema, T7: JsonSchema, T8: JsonSchema, T9: JsonSchema, T10: JsonSchema, T11: JsonSchema, T12: JsonSchema, T13: JsonSchema, T14: JsonSchema, T15: JsonSchema> JsonSchema for (T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)

source§

impl<T> JsonSchema for [T; 0]

source§

impl<T> JsonSchema for [T]
where T: JsonSchema,

source§

impl<T> JsonSchema for Box<T>
where T: JsonSchema + ?Sized,

source§

impl<T> JsonSchema for BinaryHeap<T>
where T: JsonSchema,

source§

impl<T> JsonSchema for BTreeSet<T>
where T: JsonSchema,

source§

impl<T> JsonSchema for LinkedList<T>
where T: JsonSchema,

source§

impl<T> JsonSchema for VecDeque<T>
where T: JsonSchema,

source§

impl<T> JsonSchema for Rc<T>
where T: JsonSchema + ?Sized,

source§

impl<T> JsonSchema for Weak<T>
where T: JsonSchema + ?Sized,

source§

impl<T> JsonSchema for Arc<T>
where T: JsonSchema + ?Sized,

source§

impl<T> JsonSchema for Weak<T>
where T: JsonSchema + ?Sized,

source§

impl<T> JsonSchema for Vec<T>
where T: JsonSchema,

source§

impl<T> JsonSchema for Cell<T>
where T: JsonSchema + ?Sized,

source§

impl<T> JsonSchema for RefCell<T>
where T: JsonSchema + ?Sized,

source§

impl<T> JsonSchema for Reverse<T>
where T: JsonSchema,

source§

impl<T> JsonSchema for Wrapping<T>
where T: JsonSchema,

source§

impl<T> JsonSchema for Mutex<T>
where T: JsonSchema + ?Sized,

source§

impl<T> JsonSchema for RwLock<T>
where T: JsonSchema + ?Sized,

source§

impl<T, H> JsonSchema for HashSet<T, H>
where T: JsonSchema,

source§

impl<T: JsonSchema> JsonSchema for Bound<T>

source§

impl<T: JsonSchema> JsonSchema for Option<T>

source§

impl<T: JsonSchema> JsonSchema for [T; 1]

source§

impl<T: JsonSchema> JsonSchema for [T; 2]

source§

impl<T: JsonSchema> JsonSchema for [T; 3]

source§

impl<T: JsonSchema> JsonSchema for [T; 4]

source§

impl<T: JsonSchema> JsonSchema for [T; 5]

source§

impl<T: JsonSchema> JsonSchema for [T; 6]

source§

impl<T: JsonSchema> JsonSchema for [T; 7]

source§

impl<T: JsonSchema> JsonSchema for [T; 8]

source§

impl<T: JsonSchema> JsonSchema for [T; 9]

source§

impl<T: JsonSchema> JsonSchema for [T; 10]

source§

impl<T: JsonSchema> JsonSchema for [T; 11]

source§

impl<T: JsonSchema> JsonSchema for [T; 12]

source§

impl<T: JsonSchema> JsonSchema for [T; 13]

source§

impl<T: JsonSchema> JsonSchema for [T; 14]

source§

impl<T: JsonSchema> JsonSchema for [T; 15]

source§

impl<T: JsonSchema> JsonSchema for [T; 16]

source§

impl<T: JsonSchema> JsonSchema for [T; 17]

source§

impl<T: JsonSchema> JsonSchema for [T; 18]

source§

impl<T: JsonSchema> JsonSchema for [T; 19]

source§

impl<T: JsonSchema> JsonSchema for [T; 20]

source§

impl<T: JsonSchema> JsonSchema for [T; 21]

source§

impl<T: JsonSchema> JsonSchema for [T; 22]

source§

impl<T: JsonSchema> JsonSchema for [T; 23]

source§

impl<T: JsonSchema> JsonSchema for [T; 24]

source§

impl<T: JsonSchema> JsonSchema for [T; 25]

source§

impl<T: JsonSchema> JsonSchema for [T; 26]

source§

impl<T: JsonSchema> JsonSchema for [T; 27]

source§

impl<T: JsonSchema> JsonSchema for [T; 28]

source§

impl<T: JsonSchema> JsonSchema for [T; 29]

source§

impl<T: JsonSchema> JsonSchema for [T; 30]

source§

impl<T: JsonSchema> JsonSchema for [T; 31]

source§

impl<T: JsonSchema> JsonSchema for [T; 32]

source§

impl<T: JsonSchema> JsonSchema for Range<T>

source§

impl<T: JsonSchema> JsonSchema for RangeInclusive<T>

source§

impl<T: JsonSchema, E: JsonSchema> JsonSchema for Result<T, E>

source§

impl<T: ?Sized> JsonSchema for PhantomData<T>

Implementors§