use serde_derive::{Deserialize, Serialize};
use util::*;
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase")]
#[serde(default)]
pub struct Field {
#[serde(skip_serializing_if = "Option::is_none")]
pub attributed_value: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub change_message: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_detector_types: Option<Vec<DataDetectorType>>,
pub key: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(skip_serializing_if = "TextAlignment::is_natural")]
pub text_alignment: TextAlignment,
pub value: Value,
#[serde(flatten)]
pub date: Option<FieldDate>,
#[serde(flatten)]
pub number: Option<FieldNumber>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(untagged)]
pub enum Value {
String(String),
Int(i32),
Float(f64),
}
impl Default for Value {
fn default() -> Value {
Value::String("".to_string())
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum DataDetectorType {
#[serde(rename = "PKDataDetectorTypePhoneNumber")]
PhoneNumber,
#[serde(rename = "PKDataDetectorTypeLink")]
Link,
#[serde(rename = "PKDataDetectorTypeAddress")]
Address,
#[serde(rename = "PKDataDetectorTypeCalendarEvent")]
CalendarEvent,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum TextAlignment {
#[serde(rename = "PKTextAlignmentLeft")]
Left,
#[serde(rename = "PKTextAlignmentCenter")]
Center,
#[serde(rename = "PKTextAlignmentRight")]
Right,
#[serde(rename = "PKTextAlignmentNatural")]
Natural,
}
impl Default for TextAlignment {
fn default() -> TextAlignment {
TextAlignment::Natural
}
}
impl TextAlignment {
pub fn is_natural(&self) -> bool {
match *self {
TextAlignment::Natural => true,
_ => false,
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
#[serde(default)]
#[serde(rename_all = "camelCase")]
pub struct FieldDate {
pub date_style: DateTimeStyle,
#[serde(skip_serializing_if = "is_false")]
pub ignores_time_zone: bool,
#[serde(skip_serializing_if = "is_false")]
pub is_relative: bool,
pub time_style: DateTimeStyle,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum DateTimeStyle {
#[serde(rename = "PKDateStyleNone")]
None,
#[serde(rename = "PKDateStyleShort")]
Short,
#[serde(rename = "PKDateStyleMedium")]
Medium,
#[serde(rename = "PKDateStyleLong")]
Long,
#[serde(rename = "PKDateStyleFull")]
Full,
}
impl Default for DateTimeStyle {
fn default() -> Self {
DateTimeStyle::Medium
}
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
#[serde(default)]
#[serde(rename_all = "camelCase")]
pub struct FieldNumber {
pub currency_code: String,
pub number_style: NumberStyle,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub enum NumberStyle {
#[serde(rename = "PKNumberStyleDecimal")]
Decimal,
#[serde(rename = "PKNumberStylePercent")]
Percent,
#[serde(rename = "PKNumberStyleScientific")]
Scientific,
#[serde(rename = "PKNumberStyleSpellOut")]
SpellOut,
}
impl Default for NumberStyle {
fn default() -> Self {
NumberStyle::Decimal
}
}
impl Field {
pub fn new<L, K, V>(label: L, key: K, value: V) -> Self
where
L: Into<String>,
K: Into<String>,
V: Into<String>,
{
Field {
label: Some(label.into()),
key: key.into(),
value: Value::String(value.into()),
..Default::default()
}
}
pub fn new_with_change<L, K, V, C>(label: L, key: K, value: V, change: C) -> Self
where
L: Into<String>,
K: Into<String>,
V: Into<String>,
C: Into<String>,
{
Field {
change_message: Some(change.into()),
..Field::new(label, key, value)
}
}
}