use serde_json;
use serde::Serialize;
use chrono::{DateTime, Utc};
use chrono::format::{self, Parsed};
use private::field::{DocumentField, FieldMapping, FieldType};
pub use date::{DateFormat, DateValue, FormattedDate, ParseError};
pub use document::DocumentType;
pub use document::mapping::{DocumentMapping, PropertiesMapping};
pub use chrono::format::{Fixed, Item, Numeric, Pad};
pub use serde::ser::SerializeStruct;
#[inline]
pub fn mapping<TField, TMapping, TPivot>() -> TMapping
where
TField: FieldType<TMapping, TPivot>,
TMapping: FieldMapping<TPivot>,
TPivot: Default,
{
TMapping::default()
}
#[inline]
pub fn field_ser<S, TMapping, TPivot>(state: &mut S, field: &'static str, _: TMapping) -> Result<(), S::Error>
where
S: SerializeStruct,
TMapping: FieldMapping<TPivot>,
TPivot: Default,
DocumentField<TMapping, TPivot>: Serialize,
{
state.serialize_field(field, &DocumentField::<TMapping, TPivot>::default())
}
#[inline]
pub fn standalone_field_ser<TMapping, TPivot>(_: TMapping) -> Result<String, serde_json::Error>
where
TMapping: FieldMapping<TPivot>,
TPivot: Default,
DocumentField<TMapping, TPivot>: Serialize,
{
serde_json::to_string(&DocumentField::<TMapping, TPivot>::default())
}
pub fn parse_from_tokens<'a>(date: &str, fmt: Vec<Item<'a>>) -> Result<DateValue, ParseError> {
let mut parsed = Parsed::new();
match format::parse(&mut parsed, date, fmt.into_iter()) {
Ok(_) => {
if parsed.hour_mod_12.is_none() {
let _ = parsed.set_hour(0);
let _ = parsed.set_minute(0);
}
let naive_date = parsed.to_naive_datetime_with_offset(0)?;
let date = DateTime::from_utc(naive_date, Utc);
Ok(date.into())
}
Err(e) => Err(e.into()),
}
}
pub fn format_with_tokens<'a>(date: &'a DateValue, fmt: Vec<Item<'a>>) -> FormattedDate<'a> {
date.format_with_items(fmt.into_iter()).into()
}