use crate::registry::RecordId;
use core::fmt;
use serde::{Deserialize, Serialize};
use std::collections::HashSet;
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) -> HashSet<&AnyHash> {
Default::default()
}
}
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[non_exhaustive]
pub enum Permission {
Commit,
}
impl Permission {
pub const fn all() -> [Permission; 1] {
[Permission::Commit]
}
}
impl fmt::Display for Permission {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Permission::Commit => write!(f, "commit"),
}
}
}
impl FromStr for Permission {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"commit" => Ok(Permission::Commit),
_ => 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>,
},
}
impl OperatorEntry {
pub fn required_permission(&self) -> Option<Permission> {
match self {
Self::Init { .. } => None,
Self::GrantFlat { .. } | Self::RevokeFlat { .. } => Some(Permission::Commit),
}
}
}