use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[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 {
#[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);
}
}