use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AttrType {
#[serde(rename = "string")]
String,
#[serde(rename = "integer")]
Integer,
#[serde(rename = "float")]
Float,
#[serde(rename = "boolean")]
Boolean,
#[serde(rename = "time")]
Time,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum AttrValue {
Boolean(bool),
Integer(i64),
Float(f64),
Time(DateTime<Utc>),
String(String),
}
impl AttrValue {
#[must_use]
pub fn attr_type(&self) -> AttrType {
match self {
AttrValue::String(_) => AttrType::String,
AttrValue::Integer(_) => AttrType::Integer,
AttrValue::Float(_) => AttrType::Float,
AttrValue::Boolean(_) => AttrType::Boolean,
AttrValue::Time(_) => AttrType::Time,
}
}
#[must_use]
pub fn to_text(&self) -> String {
match self {
AttrValue::String(s) => s.clone(),
AttrValue::Integer(i) => i.to_string(),
AttrValue::Float(f) => f.to_string(),
AttrValue::Boolean(b) => b.to_string(),
AttrValue::Time(t) => t.to_rfc3339(),
}
}
}