Bootstrap geth Rust workspace

This commit is contained in:
Eric Wendland 2026-05-15 15:08:20 +02:00
commit 26f81ff1ef
73 changed files with 4835 additions and 0 deletions

View file

@ -0,0 +1,14 @@
[package]
name = "geth-resource"
version = "0.1.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
[dependencies]
serde.workspace = true
thiserror.workspace = true
geth-types = { path = "../geth-types" }
[dev-dependencies]
serde_json.workspace = true

View file

@ -0,0 +1,88 @@
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);
}
}