1use protobuf::MessageFull;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5use crate::schema::base64_proto;
6
7pub type Id = u32;
8
9#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub enum Capability {
12 ClientPublish,
13 Parameters,
14 ParametersSubscribe,
15 Time,
16 Services,
17 ConnectionGraph,
18 Assets,
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: Id,
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: Id, 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: Id,
72 pub channel_id: Id,
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}