aldrin_core/
service_info.rs1#[cfg(test)]
2mod test_old1;
3
4use crate::error::{DeserializeError, SerializeError};
5use crate::ids::TypeId;
6use crate::value_deserializer::{Deserialize, Deserializer};
7use crate::value_serializer::{AsSerializeArg, Serialize, Serializer};
8use num_enum::{IntoPrimitive, TryFromPrimitive};
9
10#[derive(IntoPrimitive, TryFromPrimitive)]
11#[repr(u32)]
12enum ServiceInfoField {
13 Version = 0,
14 TypeId = 1,
15 SubscribeAll = 2,
16}
17
18#[derive(Debug, Copy, Clone, PartialEq, Eq)]
19pub struct ServiceInfo {
20 version: u32,
21 type_id: Option<TypeId>,
22 subscribe_all: Option<bool>,
23}
24
25impl ServiceInfo {
26 pub fn new(version: u32) -> Self {
27 Self {
28 version,
29 type_id: None,
30 subscribe_all: None,
31 }
32 }
33
34 pub fn version(self) -> u32 {
35 self.version
36 }
37
38 #[must_use = "this method follows the builder pattern and returns a new `ServiceInfo`"]
39 pub fn set_version(mut self, version: u32) -> Self {
40 self.version = version;
41 self
42 }
43
44 pub fn type_id(self) -> Option<TypeId> {
45 self.type_id
46 }
47
48 #[must_use = "this method follows the builder pattern and returns a new `ServiceInfo`"]
49 pub fn set_type_id(mut self, type_id: TypeId) -> Self {
50 self.type_id = Some(type_id);
51 self
52 }
53
54 pub fn subscribe_all(self) -> Option<bool> {
55 self.subscribe_all
56 }
57
58 #[must_use = "this method follows the builder pattern and returns a new `ServiceInfo`"]
59 pub fn set_subscribe_all(mut self, subscribe_all: bool) -> Self {
60 self.subscribe_all = Some(subscribe_all);
61 self
62 }
63}
64
65impl Serialize for ServiceInfo {
66 fn serialize(&self, serializer: Serializer) -> Result<(), SerializeError> {
67 let mut serializer = serializer.serialize_struct(3)?;
68
69 serializer.serialize_field(ServiceInfoField::Version, &self.version)?;
70 serializer.serialize_field(ServiceInfoField::TypeId, &self.type_id)?;
71 serializer.serialize_field(ServiceInfoField::SubscribeAll, &self.subscribe_all)?;
72
73 serializer.finish()
74 }
75}
76
77impl Deserialize for ServiceInfo {
78 fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
79 let mut deserializer = deserializer.deserialize_struct()?;
80
81 let mut version = None;
82 let mut type_id = None;
83 let mut subscribe_all = None;
84
85 while deserializer.has_more_fields() {
86 let deserializer = deserializer.deserialize_field()?;
87
88 match deserializer.try_id() {
89 Ok(ServiceInfoField::Version) => version = deserializer.deserialize().map(Some)?,
90 Ok(ServiceInfoField::TypeId) => type_id = deserializer.deserialize()?,
91 Ok(ServiceInfoField::SubscribeAll) => subscribe_all = deserializer.deserialize()?,
92 Err(_) => deserializer.skip()?,
93 }
94 }
95
96 deserializer.finish_with(|_| {
97 Ok(Self {
98 version: version.ok_or(DeserializeError::InvalidSerialization)?,
99 type_id,
100 subscribe_all,
101 })
102 })
103 }
104}
105
106impl AsSerializeArg for ServiceInfo {
107 type SerializeArg<'a> = Self;
108
109 fn as_serialize_arg<'a>(&'a self) -> Self::SerializeArg<'a>
110 where
111 Self: 'a,
112 {
113 *self
114 }
115}
116
117#[cfg(test)]
118mod test {
119 use super::ServiceInfo;
120 use crate::ids::TypeId;
121 use crate::serialized_value::SerializedValue;
122 use uuid::uuid;
123
124 fn serde(info: ServiceInfo) -> ServiceInfo {
125 SerializedValue::serialize(&info)
126 .unwrap()
127 .deserialize()
128 .unwrap()
129 }
130
131 #[test]
132 fn serialize() {
133 let info = ServiceInfo::new(1);
134 assert_eq!(info, serde(info));
135
136 let info =
137 ServiceInfo::new(1).set_type_id(TypeId(uuid!("88e82fb9-03b2-4f51-94d8-4702cfacc90c")));
138 assert_eq!(info, serde(info));
139
140 let info = ServiceInfo::new(1).set_subscribe_all(true);
141 assert_eq!(info, serde(info));
142
143 let info = ServiceInfo::new(1)
144 .set_type_id(TypeId(uuid!("88e82fb9-03b2-4f51-94d8-4702cfacc90c")))
145 .set_subscribe_all(true);
146 assert_eq!(info, serde(info));
147 }
148}