#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(transparent))]
pub struct NamespaceId(pub String);
impl NamespaceId {
pub fn new(id: impl Into<String>) -> Self {
Self(id.into())
}
pub fn as_str(&self) -> &str {
&self.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum NamespaceKind {
Private,
Shared,
Global,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Namespace {
pub id: NamespaceId,
pub kind: NamespaceKind,
pub owner: String,
}
pub const DOCTRINE_NAMESPACE: &str = "ns_doctrine";
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NamespaceMembership {
pub namespace: String,
pub principal: String,
pub granted_at_unix: u64,
pub granted_by: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn namespace_id_round_trips() {
let ns = NamespaceId::new("ns_elliott_private");
assert_eq!(ns.as_str(), "ns_elliott_private");
assert_eq!(ns, NamespaceId("ns_elliott_private".into()));
}
#[test]
fn global_namespace_owner_is_system() {
let global = Namespace {
id: NamespaceId::new("ns_global"),
kind: NamespaceKind::Global,
owner: "system".into(),
};
assert_eq!(global.kind, NamespaceKind::Global);
assert_eq!(global.owner, "system");
}
}