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}