mecha10-core 0.7.0

Mecha10 core runtime and foundational types
Documentation
//! Node metadata types and builders for service discovery

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 {
    /// Create new metadata for a node
    pub fn new(node_id: impl Into<String>) -> Self {
        Self {
            node_id: node_id.into(),
            ..Default::default()
        }
    }

    crate::builder_setter!(
        /// Set node type
        into, with_type, node_type, impl Into<String>
    );

    crate::builder_setter!(
        /// Add a published topic
        push, publishes, publishes, impl Into<String>
    );

    crate::builder_setter!(
        /// Add a subscribed topic
        push, subscribes, subscribes, impl Into<String>
    );

    crate::builder_setter!(
        /// Add a capability
        push, capability, capabilities, impl Into<String>
    );

    crate::builder_setter!(
        /// Add metadata
        insert, metadata, metadata, impl Into<String>, impl Into<String>
    );
}

/// Get current Unix timestamp in seconds
pub(crate) fn current_timestamp() -> u64 {
    crate::prelude::now_secs()
}