schemars/json_schema_impls/
chrono.rs

1use crate::r#gen::SchemaGenerator;
2use crate::schema::*;
3use crate::JsonSchema;
4use chrono::prelude::*;
5use serde_json::json;
6use std::borrow::Cow;
7
8impl JsonSchema for Weekday {
9    no_ref_schema!();
10
11    fn schema_name() -> String {
12        "Weekday".to_owned()
13    }
14
15    fn schema_id() -> Cow<'static, str> {
16        Cow::Borrowed("chrono::Weekday")
17    }
18
19    fn json_schema(_: &mut SchemaGenerator) -> Schema {
20        SchemaObject {
21            instance_type: Some(InstanceType::String.into()),
22            enum_values: Some(vec![
23                json!("Mon"),
24                json!("Tue"),
25                json!("Wed"),
26                json!("Thu"),
27                json!("Fri"),
28                json!("Sat"),
29                json!("Sun"),
30            ]),
31            ..Default::default()
32        }
33        .into()
34    }
35}
36
37macro_rules! formatted_string_impl {
38    ($ty:ident, $format:literal) => {
39        formatted_string_impl!($ty, $format, JsonSchema for $ty);
40    };
41    ($ty:ident, $format:literal, $($desc:tt)+) => {
42        impl $($desc)+ {
43            no_ref_schema!();
44
45            fn schema_name() -> String {
46                stringify!($ty).to_owned()
47            }
48
49            fn schema_id() -> Cow<'static, str>  {
50                Cow::Borrowed(stringify!(chrono::$ty))
51            }
52
53            fn json_schema(_: &mut SchemaGenerator) -> Schema {
54                SchemaObject {
55                    instance_type: Some(InstanceType::String.into()),
56                    format: Some($format.to_owned()),
57                    ..Default::default()
58                }
59                .into()
60            }
61        }
62    };
63}
64
65formatted_string_impl!(NaiveDate, "date");
66formatted_string_impl!(NaiveDateTime, "partial-date-time");
67formatted_string_impl!(NaiveTime, "partial-date-time");
68formatted_string_impl!(DateTime, "date-time", <Tz: TimeZone> JsonSchema for DateTime<Tz>);