digitalis_core/
common.rs

1use protobuf::MessageFull;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5use crate::schema::base64_proto;
6
7pub type ChannelId = u32;
8pub type SubscriptionId = u32;
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
11#[serde(rename_all = "camelCase")]
12pub enum Capability {
13    ClientPublish,
14    Parameters,
15    ParametersSubscribe,
16    Time,
17    Services,
18    ConnectionGraph,
19}
20
21#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
22#[serde(rename_all = "lowercase")]
23pub enum MessageEncoding {
24    Json,
25    Protobuf,
26    FlatBuffer,
27    Ros1,
28    /// for ROS 2
29    Cdr,
30}
31
32#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
33#[serde(rename_all = "lowercase")]
34pub enum SchemaEncoding {
35    JsonSchema,
36    Protobuf,
37    FlatBuffer,
38    Ros1Msg,
39    Ros2Msg,
40    Ros2Idl,
41}
42
43#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
44#[serde(rename_all = "camelCase")]
45pub struct AdvertiseChannel {
46    pub id: ChannelId,
47    pub topic: String,
48    pub encoding: MessageEncoding,
49    pub schema_name: String,
50    pub schema: String,
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub schema_encoding: Option<SchemaEncoding>,
53}
54
55impl AdvertiseChannel {
56    pub fn protobuf<T: MessageFull>(id: u32, topic: &str) -> Self {
57        Self {
58            id,
59            topic: topic.into(),
60            encoding: MessageEncoding::Protobuf,
61            schema_name: T::descriptor().full_name().into(),
62            schema: base64_proto::<T>(),
63            schema_encoding: None,
64        }
65    }
66}
67
68#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
69#[serde(rename_all = "camelCase")]
70pub struct SubscribeChannel {
71    pub id: SubscriptionId,
72    pub channel_id: ChannelId,
73}
74
75#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
76pub struct Parameter {
77    pub name: String,
78    pub value: Value,
79    #[serde(skip_serializing_if = "Option::is_none")]
80    pub r#type: Option<ParameterType>,
81}
82
83#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
84#[serde(rename_all = "snake_case")]
85pub enum ParameterType {
86    ByteArray,
87}