use chrono::{NaiveDate, NaiveDateTime, NaiveTime};
use rust_decimal::Decimal;
#[derive(Debug, Clone, PartialEq)]
pub enum Value {
Null,
Bool(bool),
I8(i8),
I16(i16),
I32(i32),
I64(i64),
U8(u8),
U16(u16),
U32(u32),
U64(u64),
F32(f32),
F64(f64),
String(String),
Bytes(Vec<u8>),
Date(NaiveDate),
DateTime(NaiveDateTime),
Time(NaiveTime),
Decimal(Decimal),
Json(serde_json::Value),
}
impl Value {
pub fn is_null(&self) -> bool {
matches!(self, Value::Null)
}
pub fn type_name(&self) -> &'static str {
match self {
Value::Null => "null",
Value::Bool(_) => "bool",
Value::I8(_) => "i8",
Value::I16(_) => "i16",
Value::I32(_) => "i32",
Value::I64(_) => "i64",
Value::U8(_) => "u8",
Value::U16(_) => "u16",
Value::U32(_) => "u32",
Value::U64(_) => "u64",
Value::F32(_) => "f32",
Value::F64(_) => "f64",
Value::String(_) => "string",
Value::Bytes(_) => "bytes",
Value::Date(_) => "date",
Value::DateTime(_) => "datetime",
Value::Time(_) => "time",
Value::Decimal(_) => "decimal",
Value::Json(_) => "json",
}
}
}
impl From<bool> for Value {
fn from(v: bool) -> Self {
Value::Bool(v)
}
}
impl From<i8> for Value {
fn from(v: i8) -> Self {
Value::I8(v)
}
}
impl From<i16> for Value {
fn from(v: i16) -> Self {
Value::I16(v)
}
}
impl From<i32> for Value {
fn from(v: i32) -> Self {
Value::I32(v)
}
}
impl From<i64> for Value {
fn from(v: i64) -> Self {
Value::I64(v)
}
}
impl From<u8> for Value {
fn from(v: u8) -> Self {
Value::U8(v)
}
}
impl From<u16> for Value {
fn from(v: u16) -> Self {
Value::U16(v)
}
}
impl From<u32> for Value {
fn from(v: u32) -> Self {
Value::U32(v)
}
}
impl From<u64> for Value {
fn from(v: u64) -> Self {
Value::U64(v)
}
}
impl From<f32> for Value {
fn from(v: f32) -> Self {
Value::F32(v)
}
}
impl From<f64> for Value {
fn from(v: f64) -> Self {
Value::F64(v)
}
}
impl From<String> for Value {
fn from(v: String) -> Self {
Value::String(v)
}
}
impl From<&str> for Value {
fn from(v: &str) -> Self {
Value::String(v.to_string())
}
}
impl From<Vec<u8>> for Value {
fn from(v: Vec<u8>) -> Self {
Value::Bytes(v)
}
}
impl From<&[u8]> for Value {
fn from(v: &[u8]) -> Self {
Value::Bytes(v.to_vec())
}
}
impl From<NaiveDate> for Value {
fn from(v: NaiveDate) -> Self {
Value::Date(v)
}
}
impl From<NaiveDateTime> for Value {
fn from(v: NaiveDateTime) -> Self {
Value::DateTime(v)
}
}
impl From<NaiveTime> for Value {
fn from(v: NaiveTime) -> Self {
Value::Time(v)
}
}
impl From<Decimal> for Value {
fn from(v: Decimal) -> Self {
Value::Decimal(v)
}
}
impl From<serde_json::Value> for Value {
fn from(v: serde_json::Value) -> Self {
Value::Json(v)
}
}
impl<T: Into<Value>> From<Option<T>> for Value {
fn from(v: Option<T>) -> Self {
match v {
Some(v) => v.into(),
None => Value::Null,
}
}
}