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 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}