1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
19#[serde(untagged)]
20pub enum Value {
21 Null,
23 Bool(bool),
25 Int(i64),
27 Float(f64),
29 Text(String),
31 Bytes(Vec<u8>),
33 Array(Vec<Value>),
35 Map(HashMap<String, Value>),
37 Uuid(uuid::Uuid),
39 DateTime(chrono::DateTime<chrono::Utc>),
41 Json(serde_json::Value),
43}
44
45impl Value {
46 pub fn is_null(&self) -> bool {
47 matches!(self, Value::Null)
48 }
49
50 pub fn as_str(&self) -> Option<&str> {
51 match self {
52 Value::Text(s) => Some(s.as_str()),
53 _ => None,
54 }
55 }
56
57 pub fn as_i64(&self) -> Option<i64> {
58 match self {
59 Value::Int(i) => Some(*i),
60 _ => None,
61 }
62 }
63
64 pub fn as_f64(&self) -> Option<f64> {
65 match self {
66 Value::Float(f) => Some(*f),
67 Value::Int(i) => Some(*i as f64),
68 _ => None,
69 }
70 }
71
72 pub fn as_bool(&self) -> Option<bool> {
73 match self {
74 Value::Bool(b) => Some(*b),
75 _ => None,
76 }
77 }
78}
79
80impl From<bool> for Value {
81 fn from(v: bool) -> Self { Value::Bool(v) }
82}
83impl From<i32> for Value {
84 fn from(v: i32) -> Self { Value::Int(v as i64) }
85}
86impl From<i64> for Value {
87 fn from(v: i64) -> Self { Value::Int(v) }
88}
89impl From<f32> for Value {
90 fn from(v: f32) -> Self { Value::Float(v as f64) }
91}
92impl From<f64> for Value {
93 fn from(v: f64) -> Self { Value::Float(v) }
94}
95impl From<String> for Value {
96 fn from(v: String) -> Self { Value::Text(v) }
97}
98impl From<&str> for Value {
99 fn from(v: &str) -> Self { Value::Text(v.to_owned()) }
100}
101impl From<uuid::Uuid> for Value {
102 fn from(v: uuid::Uuid) -> Self { Value::Uuid(v) }
103}
104impl From<chrono::DateTime<chrono::Utc>> for Value {
105 fn from(v: chrono::DateTime<chrono::Utc>) -> Self { Value::DateTime(v) }
106}
107impl From<serde_json::Value> for Value {
108 fn from(v: serde_json::Value) -> Self { Value::Json(v) }
109}
110impl<T: Into<Value>> From<Option<T>> for Value {
111 fn from(v: Option<T>) -> Self {
112 match v {
113 Some(inner) => inner.into(),
114 None => Value::Null,
115 }
116 }
117}
118
119pub type Row = HashMap<String, Value>;