sonya_meta/
message.rs

1use serde::de::Unexpected;
2use serde::{Deserialize, Deserializer, Serialize, Serializer};
3use serde_json::Value;
4use std::fmt::{Debug, Display, Formatter};
5use std::num::NonZeroU64;
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct EventMessage {
9    pub id: String,
10    pub sequence: Sequence,
11    pub payload: Value,
12}
13
14pub type Sequence = Option<SequenceId>;
15
16pub type SequenceId = NonZeroU64;
17
18pub type RequestSequence = Option<RequestSequenceId>;
19
20#[derive(Debug, Copy, Clone)]
21pub enum RequestSequenceId {
22    Id(SequenceId),
23    Last,
24    First,
25}
26
27impl Serialize for RequestSequenceId {
28    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
29    where
30        S: Serializer,
31    {
32        match self {
33            RequestSequenceId::Id(s) => serializer.serialize_u64(s.get()),
34            RequestSequenceId::Last => serializer.serialize_str("last"),
35            RequestSequenceId::First => serializer.serialize_str("first"),
36        }
37    }
38}
39
40impl<'de> Deserialize<'de> for RequestSequenceId {
41    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
42    where
43        D: Deserializer<'de>,
44    {
45        struct SequenceVisitor;
46
47        impl<'de> serde::de::Visitor<'de> for SequenceVisitor {
48            type Value = RequestSequenceId;
49
50            fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
51                formatter.write_str("a non zero positive value or \"last\"")
52            }
53
54            fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
55            where
56                E: serde::de::Error,
57            {
58                if let Some(id) = SequenceId::new(v) {
59                    return Ok(RequestSequenceId::Id(id));
60                }
61
62                Err(E::invalid_value(Unexpected::Unsigned(v), &"positive value"))
63            }
64
65            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
66            where
67                E: serde::de::Error,
68            {
69                if v == RequestSequenceId::Last.to_string() {
70                    return Ok(RequestSequenceId::Last);
71                }
72                if v == RequestSequenceId::First.to_string() {
73                    return Ok(RequestSequenceId::First);
74                }
75
76                if let Ok(id) = v.parse::<u64>() {
77                    return self.visit_u64(id);
78                }
79
80                Err(E::invalid_value(Unexpected::Str(v), &"last"))
81            }
82        }
83
84        deserializer.deserialize_str(SequenceVisitor)
85    }
86}
87
88impl Display for RequestSequenceId {
89    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
90        match self {
91            RequestSequenceId::Id(s) => write!(f, "{}", s),
92            RequestSequenceId::Last => write!(f, "last"),
93            RequestSequenceId::First => write!(f, "first"),
94        }
95    }
96}
97
98impl UniqId for EventMessage {
99    fn get_id(&self) -> &str {
100        &self.id
101    }
102    fn get_sequence(&self) -> Sequence {
103        self.sequence
104    }
105
106    fn set_sequence(&mut self, sequence: SequenceId) -> Sequence {
107        self.sequence.replace(sequence)
108    }
109}
110
111pub trait UniqId {
112    fn get_id(&self) -> &str;
113    fn get_sequence(&self) -> Sequence;
114    fn set_sequence(&mut self, sequence: SequenceId) -> Sequence;
115}