use crate::registry::RecordId;
use core::fmt;
use indexmap::IndexSet;
use serde::{Deserialize, Serialize};
use std::{str::FromStr, time::SystemTime};
use warg_crypto::hash::{AnyHash, HashAlgorithm};
use warg_crypto::signing;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OperatorRecord {
pub prev: Option<RecordId>,
pub version: u32,
pub timestamp: SystemTime,
pub entries: Vec<OperatorEntry>,
}
impl crate::Record for OperatorRecord {
fn contents(&self) -> IndexSet<&AnyHash> {
Default::default()
}
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum Permission {
Commit,
DefineNamespace,
ImportNamespace,
}
impl Permission {
pub const fn all() -> [Permission; 3] {
[
Permission::Commit,
Permission::DefineNamespace,
Permission::ImportNamespace,
]
}
}
impl fmt::Display for Permission {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Permission::Commit => write!(f, "commit"),
Permission::DefineNamespace => write!(f, "defineNamespace"),
Permission::ImportNamespace => write!(f, "importNamespace"),
}
}
}
impl FromStr for Permission {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"commit" => Ok(Permission::Commit),
"defineNamespace" => Ok(Permission::DefineNamespace),
"importNamespace" => Ok(Permission::ImportNamespace),
_ => Err(()),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum OperatorEntry {
Init {
hash_algorithm: HashAlgorithm,
key: signing::PublicKey,
},
GrantFlat {
key: signing::PublicKey,
permissions: Vec<Permission>,
},
RevokeFlat {
key_id: signing::KeyID,
permissions: Vec<Permission>,
},
DefineNamespace { namespace: String },
ImportNamespace { namespace: String, registry: String },
}
impl OperatorEntry {
pub fn required_permission(&self) -> Option<Permission> {
match self {
Self::Init { .. } => None,
Self::GrantFlat { .. } | Self::RevokeFlat { .. } => Some(Permission::Commit),
Self::DefineNamespace { .. } => Some(Permission::DefineNamespace),
Self::ImportNamespace { .. } => Some(Permission::ImportNamespace),
}
}
}