use super::{FromSchema, FromSchemaError, IntoSchema, SchemaBuilder, value_kind};
use crate::schema::metadata::TypeId;
use crate::schema::schema_type::SchemaType;
use crate::schema::schema_value::{DurationValuePayload, SchemaValue};
impl IntoSchema for ::chrono::Duration {
fn type_id() -> TypeId {
TypeId::new("chrono.Duration")
}
fn register_in(_b: &mut SchemaBuilder) -> SchemaType {
SchemaType::duration()
}
fn to_value(&self) -> SchemaValue {
SchemaValue::Duration(DurationValuePayload {
nanoseconds: self
.num_nanoseconds()
.unwrap_or(self.num_seconds() * 1_000_000_000),
})
}
}
impl FromSchema for ::chrono::Duration {
fn from_value(v: &SchemaValue) -> Result<Self, FromSchemaError> {
match v {
SchemaValue::Duration(p) => Ok(::chrono::Duration::nanoseconds(p.nanoseconds)),
other => Err(FromSchemaError::shape_mismatch(
"duration",
value_kind(other),
"chrono::Duration",
)),
}
}
}
const NAIVE_DATE_FMT: &str = "%Y-%m-%d";
const NAIVE_DATE_TIME_FMT: &str = "%Y-%m-%dT%H:%M:%S%.9f";
const NAIVE_TIME_FMT: &str = "%H:%M:%S%.9f";
impl IntoSchema for ::chrono::NaiveDate {
fn type_id() -> TypeId {
TypeId::new("chrono.NaiveDate")
}
fn register_in(_b: &mut SchemaBuilder) -> SchemaType {
SchemaType::string()
}
fn to_value(&self) -> SchemaValue {
SchemaValue::String(self.format(NAIVE_DATE_FMT).to_string())
}
}
impl FromSchema for ::chrono::NaiveDate {
fn from_value(v: &SchemaValue) -> Result<Self, FromSchemaError> {
match v {
SchemaValue::String(s) => ::chrono::NaiveDate::parse_from_str(s, NAIVE_DATE_FMT)
.map_err(|e| FromSchemaError::custom(format!("invalid NaiveDate: {e}"))),
other => Err(FromSchemaError::shape_mismatch(
"string",
value_kind(other),
"NaiveDate",
)),
}
}
}
impl IntoSchema for ::chrono::NaiveDateTime {
fn type_id() -> TypeId {
TypeId::new("chrono.NaiveDateTime")
}
fn register_in(_b: &mut SchemaBuilder) -> SchemaType {
SchemaType::string()
}
fn to_value(&self) -> SchemaValue {
SchemaValue::String(self.format(NAIVE_DATE_TIME_FMT).to_string())
}
}
impl FromSchema for ::chrono::NaiveDateTime {
fn from_value(v: &SchemaValue) -> Result<Self, FromSchemaError> {
match v {
SchemaValue::String(s) => {
::chrono::NaiveDateTime::parse_from_str(s, NAIVE_DATE_TIME_FMT)
.map_err(|e| FromSchemaError::custom(format!("invalid NaiveDateTime: {e}")))
}
other => Err(FromSchemaError::shape_mismatch(
"string",
value_kind(other),
"NaiveDateTime",
)),
}
}
}
impl IntoSchema for ::chrono::NaiveTime {
fn type_id() -> TypeId {
TypeId::new("chrono.NaiveTime")
}
fn register_in(_b: &mut SchemaBuilder) -> SchemaType {
SchemaType::string()
}
fn to_value(&self) -> SchemaValue {
SchemaValue::String(self.format(NAIVE_TIME_FMT).to_string())
}
}
impl FromSchema for ::chrono::NaiveTime {
fn from_value(v: &SchemaValue) -> Result<Self, FromSchemaError> {
match v {
SchemaValue::String(s) => ::chrono::NaiveTime::parse_from_str(s, NAIVE_TIME_FMT)
.map_err(|e| FromSchemaError::custom(format!("invalid NaiveTime: {e}"))),
other => Err(FromSchemaError::shape_mismatch(
"string",
value_kind(other),
"NaiveTime",
)),
}
}
}