1mod arrays;
2mod bools;
3mod enums;
4mod externals;
5mod literals;
6mod numbers;
7mod objects;
8mod schema;
9mod schema_builder;
10mod schema_type;
11mod strings;
12mod structs;
13mod tuples;
14mod unions;
15
16pub use arrays::*;
17pub use bools::*;
18pub use enums::*;
19pub use literals::*;
20pub use numbers::*;
21pub use objects::*;
22pub use schema::*;
23pub use schema_builder::*;
24pub use schema_type::*;
25pub use strings::*;
26pub use structs::*;
27pub use tuples::*;
28pub use unions::*;
29
30use std::rc::Rc;
31use std::sync::Arc;
32
33pub trait Schematic {
35 fn schema_name() -> Option<String> {
38 None
39 }
40
41 fn build_schema(mut schema: SchemaBuilder) -> Schema {
44 schema.build()
45 }
46}
47
48impl Schematic for () {
51 fn build_schema(mut schema: SchemaBuilder) -> Schema {
52 schema.set_type_and_build(SchemaType::Null)
53 }
54}
55
56impl<T: Schematic> Schematic for &T {
57 fn build_schema(schema: SchemaBuilder) -> Schema {
58 T::build_schema(schema)
59 }
60}
61
62impl<T: Schematic> Schematic for &mut T {
63 fn build_schema(schema: SchemaBuilder) -> Schema {
64 T::build_schema(schema)
65 }
66}
67
68impl<T: Schematic> Schematic for Box<T> {
69 fn build_schema(schema: SchemaBuilder) -> Schema {
70 T::build_schema(schema)
71 }
72}
73
74impl<T: Schematic> Schematic for Rc<T> {
75 fn build_schema(schema: SchemaBuilder) -> Schema {
76 T::build_schema(schema)
77 }
78}
79
80impl<T: Schematic> Schematic for Arc<T> {
81 fn build_schema(schema: SchemaBuilder) -> Schema {
82 T::build_schema(schema)
83 }
84}
85
86impl<T: Schematic> Schematic for Option<T> {
87 fn build_schema(mut schema: SchemaBuilder) -> Schema {
88 schema.union(UnionType::new_any([schema.infer::<T>(), Schema::null()]))
89 }
90}