schematic_types/
lib.rs

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
33/// Defines a schema that represents the shape of the implementing type.
34pub trait Schematic {
35    /// Define a name for this schema type. Names are required for non-primitive values
36    /// as a means to link references, and avoid cycles.
37    fn schema_name() -> Option<String> {
38        None
39    }
40
41    /// Create and return a schema that models the structure of the implementing type.
42    /// The schema can be used to generate code, documentation, or other artifacts.
43    fn build_schema(mut schema: SchemaBuilder) -> Schema {
44        schema.build()
45    }
46}
47
48// CORE
49
50impl 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}