diff --git a/CHANGES.md b/CHANGES.md index 26674dc7..2d2c4dff 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,6 +7,7 @@ * `Driver::utc_now` (Gets current UTC timestamp) * `Driver::timezone_offset` (Gets browsers time zone offset in seconds) +* `chrono::NaiveDate` support in `AutoJsJson` ### Changed diff --git a/crates/vertigo/src/driver_module/js_value/mod.rs b/crates/vertigo/src/driver_module/js_value/mod.rs index cbfd705d..084983d5 100644 --- a/crates/vertigo/src/driver_module/js_value/mod.rs +++ b/crates/vertigo/src/driver_module/js_value/mod.rs @@ -5,6 +5,8 @@ mod memory_block; mod memory_block_read; mod memory_block_write; mod serialize; +#[cfg(feature = "chrono")] +mod serialize_chrono; pub use js_json_struct::JsJson; pub use js_value_struct::JsValue; diff --git a/crates/vertigo/src/driver_module/js_value/serialize.rs b/crates/vertigo/src/driver_module/js_value/serialize.rs index bf264809..0f6f99b1 100644 --- a/crates/vertigo/src/driver_module/js_value/serialize.rs +++ b/crates/vertigo/src/driver_module/js_value/serialize.rs @@ -300,26 +300,6 @@ impl JsJsonDeserialize for BTreeMap { } } -#[cfg(feature = "chrono")] -impl JsJsonSerialize for chrono::DateTime { - fn to_json(self) -> JsJson { - self.to_rfc3339().to_json() - } -} - -#[cfg(feature = "chrono")] -impl JsJsonDeserialize for chrono::DateTime { - fn from_json(context: JsJsonContext, json: JsJson) -> Result { - let datetime_str = String::from_json(context.clone(), json)?; - chrono::DateTime::parse_from_rfc3339(&datetime_str) - .map_err(|err| { - let message = ["DateTime parsing failed: ", &err.to_string()].concat(); - context.add(message) - }) - .map(|dt| dt.to_utc()) - } -} - /// Deserialize from JsJson to T pub fn from_json(json: JsJson) -> Result { let context = JsJsonContext::new("root"); diff --git a/crates/vertigo/src/driver_module/js_value/serialize_chrono.rs b/crates/vertigo/src/driver_module/js_value/serialize_chrono.rs new file mode 100644 index 00000000..ec586880 --- /dev/null +++ b/crates/vertigo/src/driver_module/js_value/serialize_chrono.rs @@ -0,0 +1,39 @@ +use super::js_json_struct::JsJson; +use super::{JsJsonContext, JsJsonDeserialize, JsJsonSerialize}; + +pub static NAIVE_DATE_FORMAT: &str = "%Y-%m-%d"; + +impl JsJsonSerialize for chrono::DateTime { + fn to_json(self) -> JsJson { + self.to_rfc3339().to_json() + } +} + +impl JsJsonDeserialize for chrono::DateTime { + fn from_json(context: JsJsonContext, json: JsJson) -> Result { + let datetime_str = String::from_json(context.clone(), json)?; + chrono::DateTime::parse_from_rfc3339(&datetime_str) + .map_err(|err| { + let message = ["DateTime parsing failed: ", &err.to_string()].concat(); + context.add(message) + }) + .map(|dt| dt.to_utc()) + } +} + +impl JsJsonSerialize for chrono::NaiveDate { + fn to_json(self) -> JsJson { + self.format(NAIVE_DATE_FORMAT).to_string().to_json() + } +} + +impl JsJsonDeserialize for chrono::NaiveDate { + fn from_json(context: JsJsonContext, json: JsJson) -> Result { + let datetime_str = String::from_json(context.clone(), json)?; + chrono::NaiveDate::parse_from_str(&datetime_str, NAIVE_DATE_FORMAT) + .map_err(|err| { + let message = ["DateTime parsing failed: ", &err.to_string()].concat(); + context.add(message) + }) + } +}