aboutsummaryrefslogtreecommitdiff
path: root/src/primitive/identityid.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/primitive/identityid.rs')
-rw-r--r--src/primitive/identityid.rs65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/primitive/identityid.rs b/src/primitive/identityid.rs
new file mode 100644
index 0000000..850cfb5
--- /dev/null
+++ b/src/primitive/identityid.rs
@@ -0,0 +1,65 @@
+#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
+#[repr(transparent)]
+pub struct IdentityId(pub i32);
+
+use crate::{error::ProtocolError, serialize::*};
+
+use crate::serialize::UserType;
+
+impl Serialize for IdentityId {
+ fn serialize(&self) -> Result<Vec<u8>, ProtocolError> {
+ let mut res = Vec::new();
+
+ res.append(&mut Self::NAME.serialize_utf8()?);
+ res.extend(self.0.serialize()?);
+
+ Ok(res)
+ }
+}
+
+impl Deserialize for IdentityId {
+ fn parse(b: &[u8]) -> Result<(usize, Self), ProtocolError> {
+ let (size, value) = i32::parse(b)?;
+ return Ok((size, IdentityId(value)));
+ }
+}
+
+impl From<i32> for IdentityId {
+ fn from(value: i32) -> Self {
+ IdentityId(value)
+ }
+}
+
+impl std::ops::Deref for IdentityId {
+ type Target = i32;
+
+ fn deref(&self) -> &Self::Target {
+ &self.0
+ }
+}
+
+impl UserType for IdentityId {
+ const NAME: &str = "IdentityId";
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ pub fn identityid_parse_test() {
+ let test_bytes: &[u8] = &[0, 0, 0, 1];
+ let (len, res) = IdentityId::parse(test_bytes).unwrap();
+ assert_eq!(len, test_bytes.len());
+ assert_eq!(res, IdentityId(1));
+ }
+
+ #[test]
+ pub fn identityid_serialize_test() {
+ let res = IdentityId(1).serialize().unwrap();
+ let expected_bytes: &[u8] = &[
+ 0, 0, 0, 10, 73, 100, 101, 110, 116, 105, 116, 121, 73, 100, 0, 0, 0, 1,
+ ];
+ assert_eq!(res, expected_bytes);
+ }
+}