collab-common 0.0.7

Code shared by collab's client and server
Documentation
use serde::{Deserialize, Serialize};
use uuid::Uuid;

/// TODO: docs
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)]
pub struct SessionId(Uuid);

impl core::fmt::Display for SessionId {
    #[inline]
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        self.0.fmt(f)
    }
}

impl core::str::FromStr for SessionId {
    type Err = uuid::Error;

    #[inline]
    fn from_str(s: &str) -> Result<Self, Self::Err> {
        Uuid::parse_str(s).map(Self)
    }
}

impl SessionId {
    /// TODO: docs
    #[inline]
    pub fn new_random() -> Self {
        Self(Uuid::new_v4())
    }
}

#[cfg(test)]
mod tests {
    use core::str::FromStr;

    use super::*;
    use crate::serde::{deserialize, serialize_into};

    #[test]
    fn session_id_display_from_str() {
        let session_id = SessionId::new_random();

        let displayed = session_id.to_string();

        let parsed = SessionId::from_str(&displayed).unwrap();

        assert_eq!(session_id, parsed);
    }

    #[test]
    fn session_id_serialize_deserialize() {
        let session_id = SessionId::new_random();

        let mut buf = Vec::new();

        serialize_into(&session_id, &mut buf).unwrap();

        let deserialized = deserialize::<SessionId>(&buf).unwrap();

        assert_eq!(session_id, deserialized);
    }
}