pyth_lazer_protocol/
dynamic_value.rs

1use std::collections::BTreeMap;
2
3use crate::time::{DurationUs, TimestampUs};
4use derive_more::From;
5use serde::{
6    ser::{SerializeMap, SerializeSeq},
7    Serialize,
8};
9
10#[derive(Debug, Clone, PartialEq, From)]
11pub enum DynamicValue {
12    String(String),
13    F64(f64),
14    U64(u64),
15    I64(i64),
16    Bool(bool),
17    Timestamp(TimestampUs),
18    Duration(DurationUs),
19    Bytes(Vec<u8>),
20    List(Vec<DynamicValue>),
21    Map(BTreeMap<String, DynamicValue>),
22}
23
24impl Serialize for DynamicValue {
25    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
26    where
27        S: serde::Serializer,
28    {
29        match self {
30            DynamicValue::String(v) => serializer.serialize_str(v),
31            DynamicValue::F64(v) => serializer.serialize_f64(*v),
32            DynamicValue::U64(v) => serializer.serialize_u64(*v),
33            DynamicValue::I64(v) => serializer.serialize_i64(*v),
34            DynamicValue::Bool(v) => serializer.serialize_bool(*v),
35            DynamicValue::Timestamp(v) => serializer.serialize_u64(v.as_micros()),
36            DynamicValue::Duration(v) => {
37                serializer.serialize_str(&humantime::format_duration((*v).into()).to_string())
38            }
39            DynamicValue::Bytes(v) => serializer.serialize_str(&hex::encode(v)),
40            DynamicValue::List(v) => {
41                let mut seq_serializer = serializer.serialize_seq(Some(v.len()))?;
42                for element in v {
43                    seq_serializer.serialize_element(element)?;
44                }
45                seq_serializer.end()
46            }
47            DynamicValue::Map(map) => {
48                let mut map_serializer = serializer.serialize_map(Some(map.len()))?;
49                for (k, v) in map {
50                    map_serializer.serialize_entry(k, v)?;
51                }
52                map_serializer.end()
53            }
54        }
55    }
56}