aldrin_core/
service_info.rs

1#[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}