hackdose_sml_parser/application/
domain.rs

1use serde::Serialize;
2
3#[derive(PartialEq, Debug)]
4pub struct SmlMessages {
5    pub messages: Vec<SmlMessageEnvelope>,
6}
7
8#[derive(PartialEq, Debug, Clone)]
9pub enum SmlMessageEnvelope {
10    GetOpenResponse(GetOpenResponseBody),
11    GetListResponse(GetListResponseBody),
12    GetCloseResponse,
13}
14
15#[derive(PartialEq, Debug, Clone)]
16pub struct GetOpenResponseBody {
17    pub server_id: Vec<u8>,
18    pub req_file_id: Vec<u8>,
19}
20
21#[derive(PartialEq, Debug, Clone)]
22pub struct GetListResponseBody {
23    pub server_id: Vec<u8>,
24    pub list_name: Vec<u8>,
25    pub value_list: Vec<SmlListEntry>,
26}
27
28#[derive(PartialEq, Debug, Clone)]
29pub struct SmlListEntry {
30    pub object_name: Vec<u8>,
31    pub status: Option<usize>,
32    pub value_time: Vec<u8>,
33    pub unit: Option<usize>,
34    pub scaler: Option<isize>,
35    pub value: AnyValue,
36}
37
38#[derive(PartialEq, Debug, Clone, Serialize)]
39pub enum AnyValue {
40    Unsigned(usize),
41    Signed(isize),
42    String(Vec<u8>),
43}
44
45/// Scale an SML value by the given scaler (base 10)
46pub trait Scale {
47    fn scale(&self, scaler: isize) -> Self;
48}
49
50impl Scale for AnyValue {
51    fn scale(&self, scaler: isize) -> Self {
52        match self {
53            AnyValue::Unsigned(v) => {
54                let scaler = scaler;
55                AnyValue::Unsigned((10f64.powf(scaler as f64) * *v as f64) as usize)
56            }
57            AnyValue::Signed(v) => {
58                let scaler = scaler;
59                AnyValue::Signed((10f64.powf(scaler as f64) * *v as f64) as isize)
60            }
61            AnyValue::String(v) => AnyValue::String(v.clone()),
62        }
63    }
64}