dcs2 0.1.0

An extensible distributed control system framework made in rust with no-std support.
Documentation
use alloc::format;
use alloc::string::ToString;
use core::fmt::{Debug, Display, Formatter};
use serde::de::DeserializeOwned;
use serde::{Deserialize, Serialize};

use crate::communication::connection::Address;
use crate::config::SystemNodeArgs;
use crate::nodes::SystemMetadata;

/// A [`BasicMetadata`] that can be serialized and deserialized
pub trait SerializableMetadata: BasicMetadata + Serialize + DeserializeOwned {}

/// Metadata associated to a cluster node.
pub trait BasicMetadata: Clone + Debug + Display {}

#[derive(Default, Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct NoCoordinatedMetadata;

impl Display for NoCoordinatedMetadata {
    fn fmt(&self, formatter: &mut Formatter<'_>) -> core::fmt::Result {
        write!(formatter, "[Empty]")
    }
}

impl BasicMetadata for NoCoordinatedMetadata {}

impl SerializableMetadata for NoCoordinatedMetadata {}

/// Metadata at the transport layer level. I.e. bluetooth or tcp/ip.  
pub trait CommunicationMetadata: BasicMetadata {
    type Addr: Address;
    fn address(&self) -> Self::Addr;
}

#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
pub struct NodeMetadata<CoordMetadata: BasicMetadata, CommMetadata: CommunicationMetadata> {
    pub node: SystemMetadata<CommMetadata>,
    pub coordination: Option<CoordMetadata>,
}

impl<CoordMetadata: BasicMetadata, CommMetadata: CommunicationMetadata> BasicMetadata
    for NodeMetadata<CoordMetadata, CommMetadata>
{
}

impl<CoordMetadata: BasicMetadata, CommMetadata: CommunicationMetadata> Display
    for NodeMetadata<CoordMetadata, CommMetadata>
{
    fn fmt(&self, formatter: &mut Formatter<'_>) -> core::fmt::Result {
        let coordination = self
            .coordination
            .clone()
            .map(|coord| format!("{}", coord))
            .unwrap_or_else(|| "None".to_string());

        write!(
            formatter,
            "(Role: {:?}, Coordination: {}, Communication: {})",
            self.node.role, coordination, self.node.communication
        )
    }
}

pub trait CoordinationMetadataBuilder<Metadata: SerializableMetadata + BasicMetadata>:
    Default
{
    fn build(args: &SystemNodeArgs) -> Metadata;
}

pub trait CommunicationMetadataBuilder<Metadata: CommunicationMetadata>: Default {
    fn build(args: &SystemNodeArgs) -> Metadata;
}