use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum CapabilityGroup {
#[serde(rename = "ganglion:ros/interface")]
RosInterface {
version: String,
patterns: Vec<AccessPattern>,
},
#[serde(rename = "ganglion:logs/stream")]
LogStream {
version: String,
patterns: Vec<String>,
},
#[serde(rename = "ganglion:fs/bounded")]
FsBounded {
version: String,
paths: Vec<FsAccessPattern>,
},
#[serde(rename = "ganglion:diagnostics/collect")]
DiagnosticsCollect { version: String },
#[serde(rename = "ganglion:artifacts/publish")]
ArtifactsPublish { version: String },
#[serde(rename = "ganglion:process/spawn")]
ProcessSpawn {
version: String,
allowed_commands: Vec<String>,
},
#[serde(rename = "ganglion:network/probe")]
NetworkProbe { version: String },
#[serde(rename = "ganglion:metrics/emit")]
MetricsEmit { version: String },
}
impl CapabilityGroup {
pub fn name(&self) -> &str {
match self {
Self::RosInterface { .. } => "ganglion:ros/interface",
Self::LogStream { .. } => "ganglion:logs/stream",
Self::FsBounded { .. } => "ganglion:fs/bounded",
Self::DiagnosticsCollect { .. } => "ganglion:diagnostics/collect",
Self::ArtifactsPublish { .. } => "ganglion:artifacts/publish",
Self::ProcessSpawn { .. } => "ganglion:process/spawn",
Self::NetworkProbe { .. } => "ganglion:network/probe",
Self::MetricsEmit { .. } => "ganglion:metrics/emit",
}
}
pub fn version(&self) -> &str {
match self {
Self::RosInterface { version, .. }
| Self::LogStream { version, .. }
| Self::FsBounded { version, .. }
| Self::DiagnosticsCollect { version, .. }
| Self::ArtifactsPublish { version, .. }
| Self::ProcessSpawn { version, .. }
| Self::NetworkProbe { version, .. }
| Self::MetricsEmit { version, .. } => version,
}
}
pub fn qualified_name(&self) -> String {
format!("{}@{}", self.name(), self.version())
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct AccessPattern {
pub pattern: String,
pub access: RosAccess,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RosAccess {
ReadOnly,
ReadWrite,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct FsAccessPattern {
pub pattern: String,
pub read: bool,
pub write: bool,
pub execute: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InstalledCapability {
pub name: String,
pub version: String,
pub author_peer_id: crate::identity::PeerId,
pub declared_capabilities: Vec<CapabilityGroup>,
pub component_hash: String,
pub installed_at: chrono::DateTime<chrono::Utc>,
pub component_path: std::path::PathBuf,
pub manifest_path: std::path::PathBuf,
}