54 lines
1.4 KiB
Rust
54 lines
1.4 KiB
Rust
use serde::{Deserialize, Deserializer};
|
|
use tera::{Map, Value};
|
|
use toml;
|
|
|
|
/// Used as an attribute when we want to convert from TOML to a string date
|
|
pub fn from_toml_datetime<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
|
|
where
|
|
D: Deserializer<'de>,
|
|
{
|
|
toml::value::Datetime::deserialize(deserializer).map(|s| Some(s.to_string()))
|
|
}
|
|
|
|
/// Returns key/value for a converted date from TOML.
|
|
/// If the table itself is the TOML struct, only return its value without the key
|
|
fn convert_toml_date(table: Map<String, Value>) -> Value {
|
|
let mut new = Map::new();
|
|
|
|
for (k, v) in table {
|
|
if k == "$__toml_private_datetime" {
|
|
return v;
|
|
}
|
|
|
|
match v {
|
|
Value::Object(o) => {
|
|
new.insert(k, convert_toml_date(o));
|
|
}
|
|
_ => {
|
|
new.insert(k, v);
|
|
}
|
|
}
|
|
}
|
|
|
|
Value::Object(new)
|
|
}
|
|
|
|
/// TOML datetimes will be serialized as a struct but we want the
|
|
/// stringified version for json, otherwise they are going to be weird
|
|
pub fn fix_toml_dates(table: Map<String, Value>) -> Value {
|
|
let mut new = Map::new();
|
|
|
|
for (key, value) in table {
|
|
match value {
|
|
Value::Object(o) => {
|
|
new.insert(key, convert_toml_date(o));
|
|
}
|
|
_ => {
|
|
new.insert(key, value);
|
|
}
|
|
}
|
|
}
|
|
|
|
Value::Object(new)
|
|
}
|