connect_stream_types/
lib.rs

1use serde::Deserialize;
2use serde::Serialize;
3
4/// A value taken from a channel.
5#[derive(Clone, Serialize, Deserialize, Debug)]
6#[serde(untagged)]
7pub enum Value {
8    String(String),
9    Double(f64),
10    Integer(i64),
11}
12
13impl From<String> for Value {
14    fn from(value: String) -> Self {
15        Value::String(value)
16    }
17}
18
19impl From<&str> for Value {
20    fn from(value: &str) -> Self {
21        Value::String(value.to_owned())
22    }
23}
24
25impl From<f64> for Value {
26    fn from(value: f64) -> Self {
27        Value::Double(value)
28    }
29}
30
31impl From<i64> for Value {
32    fn from(value: i64) -> Self {
33        Value::Integer(value)
34    }
35}
36
37impl Default for Value {
38    fn default() -> Value {
39        Value::Double(0.0)
40    }
41}
42
43impl Value {
44    pub fn into_series(self) -> ValueSeries {
45        match self {
46            Value::String(string) => ValueSeries::String(vec![string]),
47            Value::Double(double) => ValueSeries::Double(vec![double]),
48            Value::Integer(int) => ValueSeries::Integer(vec![int]),
49        }
50    }
51}
52
53/// A series of values. Mirrors the `nominal-streaming::PointsType` enum. We
54/// avoid simply re-using that type to avoid coupling the app to the api too
55/// closely.
56#[derive(Clone, Serialize, Deserialize, Debug)]
57#[serde(untagged)]
58pub enum ValueSeries {
59    String(Vec<String>),
60    Double(Vec<f64>),
61    Integer(Vec<i64>),
62}
63
64impl From<Vec<String>> for ValueSeries {
65    fn from(values: Vec<String>) -> Self {
66        ValueSeries::String(values)
67    }
68}
69
70impl From<Vec<&str>> for ValueSeries {
71    fn from(values: Vec<&str>) -> Self {
72        ValueSeries::String(values.into_iter().map(|s| s.to_owned()).collect())
73    }
74}
75
76impl From<Vec<f64>> for ValueSeries {
77    fn from(values: Vec<f64>) -> Self {
78        ValueSeries::Double(values)
79    }
80}
81
82impl From<Vec<i64>> for ValueSeries {
83    fn from(values: Vec<i64>) -> Self {
84        ValueSeries::Integer(values)
85    }
86}
87
88impl Default for ValueSeries {
89    fn default() -> ValueSeries {
90        ValueSeries::Double(Vec::new())
91    }
92}
93
94impl ValueSeries {
95    pub fn len(&self) -> usize {
96        match self {
97            ValueSeries::String(values) => values.len(),
98            ValueSeries::Double(values) => values.len(),
99            ValueSeries::Integer(values) => values.len(),
100        }
101    }
102
103    pub fn is_empty(&self) -> bool {
104        self.len() == 0
105    }
106    // Resizes down to the selected size
107    pub fn truncate(&mut self, size: usize) {
108        match self {
109            ValueSeries::String(values) => values.truncate(size),
110            ValueSeries::Double(values) => values.truncate(size),
111            ValueSeries::Integer(values) => values.truncate(size),
112        }
113    }
114}