88 lines
2.2 KiB
Rust
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);
|
|
}
|
|
}
|