use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum NodeStatus {
Starting,
Running,
Stopping,
Stopped,
Unhealthy,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NodeMetadata {
pub node_id: String,
#[serde(default)]
pub node_type: String,
#[serde(default = "default_status")]
pub status: NodeStatus,
#[serde(default)]
pub started_at: u64,
#[serde(default)]
pub last_heartbeat: u64,
#[serde(default)]
pub publishes: Vec<String>,
#[serde(default)]
pub subscribes: Vec<String>,
#[serde(default)]
pub capabilities: Vec<String>,
#[serde(default)]
pub metadata: HashMap<String, String>,
}
fn default_status() -> NodeStatus {
NodeStatus::Running
}
impl Default for NodeMetadata {
fn default() -> Self {
Self {
node_id: String::new(),
node_type: String::new(),
status: NodeStatus::Running,
started_at: current_timestamp(),
last_heartbeat: current_timestamp(),
publishes: Vec::new(),
subscribes: Vec::new(),
capabilities: Vec::new(),
metadata: HashMap::new(),
}
}
}
impl NodeMetadata {
pub fn new(node_id: impl Into<String>) -> Self {
Self {
node_id: node_id.into(),
..Default::default()
}
}
crate::builder_setter!(
into, with_type, node_type, impl Into<String>
);
pub fn publishes(mut self, topic: impl Into<String>) -> Self {
self.publishes.push(topic.into());
self
}
pub fn subscribes(mut self, topic: impl Into<String>) -> Self {
self.subscribes.push(topic.into());
self
}
pub fn capability(mut self, cap: impl Into<String>) -> Self {
self.capabilities.push(cap.into());
self
}
crate::builder_setter!(
insert, metadata, metadata, impl Into<String>, impl Into<String>
);
}
pub(crate) fn current_timestamp() -> u64 {
crate::prelude::now_secs()
}