use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct RequestId(pub String);
impl RequestId {
#[must_use]
pub fn new_v4() -> Self {
Self(uuid::Uuid::new_v4().to_string())
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}
impl std::fmt::Display for RequestId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.0)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(transparent)]
pub struct TabId(pub String);
impl TabId {
#[must_use]
pub fn new(id: impl Into<String>) -> Self {
Self(id.into())
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}
impl std::fmt::Display for TabId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(&self.0)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn request_id_is_uuid_v4_shaped() {
let id = RequestId::new_v4();
assert_eq!(id.as_str().len(), 36); assert_eq!(id.as_str().matches('-').count(), 4);
}
#[test]
fn ids_serialize_as_bare_strings() {
let rid = RequestId("abc".into());
let tid = TabId("page-42".into());
assert_eq!(serde_json::to_string(&rid).unwrap_or_default(), "\"abc\"");
assert_eq!(
serde_json::to_string(&tid).unwrap_or_default(),
"\"page-42\""
);
}
}