From e11d5e5a98e7367eb70af13107278e5674308908 Mon Sep 17 00:00:00 2001 From: Graham Esau Date: Sun, 27 Oct 2019 18:57:36 +0000 Subject: [PATCH] Implement JsonSchema for std::time types --- schemars/src/json_schema_impls/mod.rs | 1 + schemars/src/json_schema_impls/time.rs | 34 ++++++++++++++ .../expected/duration_and_systemtime.json | 45 +++++++++++++++++++ schemars/tests/time.rs | 15 +++++++ 4 files changed, 95 insertions(+) create mode 100644 schemars/src/json_schema_impls/time.rs create mode 100644 schemars/tests/expected/duration_and_systemtime.json create mode 100644 schemars/tests/time.rs diff --git a/schemars/src/json_schema_impls/mod.rs b/schemars/src/json_schema_impls/mod.rs index 0fc6f9b..548e942 100644 --- a/schemars/src/json_schema_impls/mod.rs +++ b/schemars/src/json_schema_impls/mod.rs @@ -15,4 +15,5 @@ mod maps; mod primitives; mod sequences; mod serdejson; +mod time; mod tuple; diff --git a/schemars/src/json_schema_impls/time.rs b/schemars/src/json_schema_impls/time.rs new file mode 100644 index 0000000..38d35b2 --- /dev/null +++ b/schemars/src/json_schema_impls/time.rs @@ -0,0 +1,34 @@ +use crate::gen::SchemaGenerator; +use crate::schema::*; +use crate::JsonSchema; +use std::time::{Duration, SystemTime}; + +impl JsonSchema for Duration { + fn schema_name() -> String { + "Duration".to_owned() + } + + fn json_schema(gen: &mut SchemaGenerator) -> Schema { + let mut schema = SchemaObject::default(); + schema.instance_type = Some(InstanceType::Object.into()); + let properties = &mut schema.object().properties; + properties.insert("secs".to_owned(), ::json_schema(gen)); + properties.insert("nanos".to_owned(), ::json_schema(gen)); + schema.into() + } +} + +impl JsonSchema for SystemTime { + fn schema_name() -> String { + "SystemTime".to_owned() + } + + fn json_schema(gen: &mut SchemaGenerator) -> Schema { + let mut schema = SchemaObject::default(); + schema.instance_type = Some(InstanceType::Object.into()); + let properties = &mut schema.object().properties; + properties.insert("secs_since_epoch".to_owned(), ::json_schema(gen)); + properties.insert("nanos_since_epoch".to_owned(), ::json_schema(gen)); + schema.into() + } +} diff --git a/schemars/tests/expected/duration_and_systemtime.json b/schemars/tests/expected/duration_and_systemtime.json new file mode 100644 index 0000000..e52d28f --- /dev/null +++ b/schemars/tests/expected/duration_and_systemtime.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "MyStruct", + "type": "object", + "required": [ + "duration", + "time" + ], + "properties": { + "duration": { + "$ref": "#/definitions/Duration" + }, + "time": { + "$ref": "#/definitions/SystemTime" + } + }, + "definitions": { + "Duration": { + "type": "object", + "properties": { + "nanos": { + "type": "integer", + "format": "uint32" + }, + "secs": { + "type": "integer", + "format": "uint64" + } + } + }, + "SystemTime": { + "type": "object", + "properties": { + "nanos_since_epoch": { + "type": "integer", + "format": "uint32" + }, + "secs_since_epoch": { + "type": "integer", + "format": "uint64" + } + } + } + } +} \ No newline at end of file diff --git a/schemars/tests/time.rs b/schemars/tests/time.rs new file mode 100644 index 0000000..8ab53a8 --- /dev/null +++ b/schemars/tests/time.rs @@ -0,0 +1,15 @@ +mod util; +use schemars::JsonSchema; +use util::*; +use std::time::{Duration, SystemTime}; + +#[derive(Debug, JsonSchema)] +struct MyStruct { + duration: Duration, + time: SystemTime, +} + +#[test] +fn duration_and_systemtime() -> TestResult { + test_default_generated_schema::("duration_and_systemtime") +}