use serde::Deserialize;
use serde::Serialize;
#[derive(Clone, Serialize, Deserialize, Debug)]
#[serde(untagged)]
pub enum Value {
String(String),
Double(f64),
Integer(i64),
}
impl From<String> for Value {
fn from(value: String) -> Self {
Value::String(value)
}
}
impl From<&str> for Value {
fn from(value: &str) -> Self {
Value::String(value.to_owned())
}
}
impl From<f64> for Value {
fn from(value: f64) -> Self {
Value::Double(value)
}
}
impl From<i64> for Value {
fn from(value: i64) -> Self {
Value::Integer(value)
}
}
impl Default for Value {
fn default() -> Value {
Value::Double(0.0)
}
}
impl Value {
pub fn into_series(self) -> ValueSeries {
match self {
Value::String(string) => ValueSeries::String(vec![string]),
Value::Double(double) => ValueSeries::Double(vec![double]),
Value::Integer(int) => ValueSeries::Integer(vec![int]),
}
}
}
#[derive(Clone, Serialize, Deserialize, Debug)]
#[serde(untagged)]
pub enum ValueSeries {
String(Vec<String>),
Double(Vec<f64>),
Integer(Vec<i64>),
}
impl From<Vec<String>> for ValueSeries {
fn from(values: Vec<String>) -> Self {
ValueSeries::String(values)
}
}
impl From<Vec<&str>> for ValueSeries {
fn from(values: Vec<&str>) -> Self {
ValueSeries::String(values.into_iter().map(|s| s.to_owned()).collect())
}
}
impl From<Vec<f64>> for ValueSeries {
fn from(values: Vec<f64>) -> Self {
ValueSeries::Double(values)
}
}
impl From<Vec<i64>> for ValueSeries {
fn from(values: Vec<i64>) -> Self {
ValueSeries::Integer(values)
}
}
impl Default for ValueSeries {
fn default() -> ValueSeries {
ValueSeries::Double(Vec::new())
}
}
impl ValueSeries {
pub fn len(&self) -> usize {
match self {
ValueSeries::String(values) => values.len(),
ValueSeries::Double(values) => values.len(),
ValueSeries::Integer(values) => values.len(),
}
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn truncate(&mut self, size: usize) {
match self {
ValueSeries::String(values) => values.truncate(size),
ValueSeries::Double(values) => values.truncate(size),
ValueSeries::Integer(values) => values.truncate(size),
}
}
}