geth/crates/geth-resource/src/lib.rs

88 lines
2.2 KiB
Rust

use geth_types::{ResourceId, ResourceKind, ResourceName};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ResourceDescriptor {
pub id: ResourceId,
pub kind: ResourceKind,
pub name: ResourceName,
pub authority: ResourceAuthorityRef,
pub local_role: LocalRole,
pub replication: ReplicationPolicy,
pub retention: RetentionPolicy,
pub status: ResourceStatus,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", content = "value", rename_all = "kebab-case")]
pub enum ResourceAuthorityRef {
Local,
Resource(ResourceId),
External(String),
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum LocalRole {
Owner,
Replica,
Cache,
Stub,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum ReplicationPolicy {
LocalOnly,
Manual,
Mesh,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum RetentionPolicy {
Keep,
Cache,
Ephemeral,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum ResourceStatus {
Active,
Stub,
Revoked,
}
impl ResourceDescriptor {
#[must_use]
pub fn local(id: ResourceId, kind: ResourceKind, name: ResourceName) -> Self {
Self {
id,
kind,
name,
authority: ResourceAuthorityRef::Local,
local_role: LocalRole::Owner,
replication: ReplicationPolicy::LocalOnly,
retention: RetentionPolicy::Keep,
status: ResourceStatus::Active,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resource_descriptor_serializes() {
let descriptor = ResourceDescriptor::local(
ResourceId::new("resource:notes"),
ResourceKind::Kv,
ResourceName::new("notes"),
);
let json = serde_json::to_string(&descriptor).expect("json");
let decoded: ResourceDescriptor = serde_json::from_str(&json).expect("decode");
assert_eq!(decoded, descriptor);
}
}