connect-stream-types 0.1.0

Type definitions for streaming types used internally by Connect
Documentation
use serde::Deserialize;
use serde::Serialize;

/// A value taken from a channel.
#[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]),
        }
    }
}

/// A series of values. Mirrors the `nominal-streaming::PointsType` enum. We
/// avoid simply re-using that type to avoid coupling the app to the api too
/// closely.
#[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
    }
    // Resizes down to the selected size
    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),
        }
    }
}