schemars/macros.rs
1/// Generates a [`Schema`](crate::Schema) for the given type using default settings.
2/// The default settings currently conform to [JSON Schema 2020-12](https://json-schema.org/specification-links#2020-12), but this is liable to change in a future version of Schemars if support for other JSON Schema versions is added.
3///
4/// The type must implement [`JsonSchema`](crate::JsonSchema).
5///
6/// # Example
7/// ```
8/// use schemars::{schema_for, JsonSchema};
9///
10/// #[derive(JsonSchema)]
11/// struct MyStruct {
12/// foo: i32,
13/// }
14///
15/// let my_schema = schema_for!(MyStruct);
16/// ```
17#[cfg(doc)]
18#[macro_export]
19macro_rules! schema_for {
20 ($type:ty) => {
21 $crate::SchemaGenerator::default().into_root_schema_for::<$type>()
22 };
23}
24
25/// Generates a [`Schema`](crate::Schema) for the given type using default settings.
26/// The default settings currently conform to [JSON Schema 2020-12](https://json-schema.org/specification-links#2020-12), but this is liable to change in a future version of Schemars if support for other JSON Schema versions is added.
27///
28/// The type must implement [`JsonSchema`](crate::JsonSchema).
29///
30/// # Example
31/// ```
32/// use schemars::{schema_for, JsonSchema};
33///
34/// #[derive(JsonSchema)]
35/// struct MyStruct {
36/// foo: i32,
37/// }
38///
39/// let my_schema = schema_for!(MyStruct);
40/// ```
41#[cfg(not(doc))]
42#[macro_export]
43macro_rules! schema_for {
44 ($type:ty) => {
45 $crate::SchemaGenerator::default().into_root_schema_for::<$type>()
46 };
47 ($_:expr) => {
48 compile_error!("This argument to `schema_for!` is not a type - did you mean to use `schema_for_value!` instead?")
49 };
50}
51
52/// Generates a [`Schema`](crate::Schema) for the given example value using default settings.
53/// The default settings currently conform to [JSON Schema 2020-12](https://json-schema.org/specification-links#2020-12), but this is liable to change in a future version of Schemars if support for other JSON Schema versions is added.
54///
55/// The value must implement [`Serialize`](serde::Serialize). If the value also implements
56/// [`JsonSchema`](crate::JsonSchema), then prefer using the [`schema_for!(Type)`](schema_for) macro
57/// which will generally produce a more precise schema, particularly when the value contains any
58/// enums.
59///
60/// If the `Serialize` implementation of the value decides to fail, this macro will panic.
61/// For a non-panicking alternative, create a [`SchemaGenerator`](crate::SchemaGenerator) and use
62/// its [`into_root_schema_for_value`](crate::SchemaGenerator::into_root_schema_for_value) method.
63///
64/// # Example
65/// ```
66/// use schemars::schema_for_value;
67///
68/// #[derive(serde::Serialize)]
69/// struct MyStruct {
70/// foo: i32,
71/// }
72///
73/// let my_schema = schema_for_value!(MyStruct { foo: 123 });
74/// ```
75#[macro_export]
76macro_rules! schema_for_value {
77 ($value:expr) => {
78 $crate::SchemaGenerator::default()
79 .into_root_schema_for_value(&$value)
80 .unwrap()
81 };
82}
83
84/// Construct a [`Schema`](crate::Schema) from a JSON literal. This can either be a JSON object, or
85/// a boolean (`true` or `false`).
86///
87/// You can interpolate variables or expressions into a JSON object using the same rules as the
88/// [`serde_json::json`] macro.
89///
90/// # Example
91/// ```
92/// use schemars::{Schema, json_schema};
93///
94/// let desc = "A helpful description.";
95/// let my_schema: Schema = json_schema!({
96/// "description": desc,
97/// "type": ["object", "null"]
98/// });
99/// ```
100#[macro_export]
101macro_rules! json_schema {
102 (
103 {$($json_object:tt)*}
104 ) => {
105 <$crate::Schema as ::core::convert::TryFrom<_>>::try_from($crate::_private::serde_json::json!({$($json_object)*})).unwrap()
106 };
107 (true) => {
108 $crate::Schema::from(true)
109 };
110 (false) => {
111 $crate::Schema::from(false)
112 };
113}