digitalis-core 0.1.0

Core module for Digitalis
Documentation
use protobuf::MessageFull;
use serde::{Deserialize, Serialize};
use serde_json::Value;

use crate::schema::base64_proto;

pub type Id = u32;

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum Capability {
    ClientPublish,
    Parameters,
    ParametersSubscribe,
    Time,
    Services,
    ConnectionGraph,
    Assets,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum MessageEncoding {
    Json,
    Protobuf,
    FlatBuffer,
    Ros1,
    /// for ROS 2
    Cdr,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum SchemaEncoding {
    JsonSchema,
    Protobuf,
    FlatBuffer,
    Ros1Msg,
    Ros2Msg,
    Ros2Idl,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AdvertiseChannel {
    pub id: Id,
    pub topic: String,
    pub encoding: MessageEncoding,
    pub schema_name: String,
    pub schema: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub schema_encoding: Option<SchemaEncoding>,
}

impl AdvertiseChannel {
    pub fn protobuf<T: MessageFull>(id: Id, topic: &str) -> Self {
        Self {
            id,
            topic: topic.into(),
            encoding: MessageEncoding::Protobuf,
            schema_name: T::descriptor().full_name().into(),
            schema: base64_proto::<T>(),
            schema_encoding: None,
        }
    }
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SubscribeChannel {
    pub id: Id,
    pub channel_id: Id,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Parameter {
    pub name: String,
    pub value: Value,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub r#type: Option<ParameterType>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ParameterType {
    ByteArray,
}