cosmwasm_schema/
schema_for.rs

1/// Generates a [`RootSchema`](crate::schemars::schema::RootSchema) for the given type using default settings.
2///
3/// The type must implement [`JsonSchema`](crate::schemars::JsonSchema).
4///
5/// The schema version is strictly `draft-07`.
6///
7/// # Example
8/// ```
9/// use cosmwasm_schema::schema_for;
10/// use schemars::JsonSchema;
11///
12/// #[derive(JsonSchema)]
13/// struct MyStruct {
14///     foo: i32,
15/// }
16///
17/// let my_schema = schema_for!(MyStruct);
18/// ```
19#[macro_export]
20macro_rules! schema_for {
21    ($type:ty) => {{
22        let mut schema = $crate::schemars::gen::SchemaGenerator::new(
23            $crate::schemars::gen::SchemaSettings::draft07(),
24        )
25        .into_root_schema_for::<$type>();
26
27        struct Visitor;
28        impl $crate::schemars::visit::Visitor for Visitor {
29            fn visit_schema_object(&mut self, schema: &mut $crate::schemars::schema::SchemaObject) {
30                $crate::schemars::visit::visit_schema_object(self, schema);
31
32                if let Some(ref mut validation) = schema.object {
33                    if validation.additional_properties.is_some() {
34                        return;
35                    }
36
37                    validation.additional_properties = Some(Box::new(false.into()));
38                }
39            }
40        }
41
42        $crate::schemars::visit::visit_root_schema(&mut Visitor, &mut schema);
43
44        schema
45    }};
46    ($_:expr) => {
47        compile_error!("The argument to `schema_for!` is not a type.")
48    };
49}