pyth_lazer_protocol/
dynamic_value.rs1use 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}