use cid::Cid;
use co_primitives::TotalFloat64;
use derive_more::{From, TryInto};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, From, TryInto, Serialize, Deserialize)]
#[serde(untagged)]
pub enum DynamicValue {
Null,
#[from]
Bool(bool),
#[from(types(i8, i16, i32))]
Integer(i64),
Float(TotalFloat64),
String(String),
#[from]
Bytes(Vec<u8>),
#[from]
List(Vec<DynamicValue>),
#[from]
Map(BTreeMap<String, DynamicValue>),
#[from]
Link(Cid),
}
impl DynamicValue {
pub fn is_empty(&self) -> bool {
match self {
DynamicValue::Null => true,
DynamicValue::Bool(v) => v == &bool::default(),
DynamicValue::Integer(v) => v == &i64::default(),
DynamicValue::Float(v) => *v == TotalFloat64::from(0f64),
DynamicValue::String(v) => v.is_empty(),
DynamicValue::Bytes(v) => v.is_empty(),
DynamicValue::List(v) => v.is_empty(),
DynamicValue::Map(v) => v.is_empty(),
DynamicValue::Link(_) => false,
}
}
pub fn string(&self) -> Option<&str> {
match self {
DynamicValue::String(s) => Some(s),
_ => None,
}
}
}
impl From<String> for DynamicValue {
fn from(value: String) -> Self {
Self::String(value)
}
}
impl From<&str> for DynamicValue {
fn from(value: &str) -> Self {
Self::String(value.to_owned())
}
}