1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/// A type that can be used as a DDS topic payload.
///
/// Implement this trait to register a type as a DDS topic payload. The derive
/// macro [`Topicable`](cyclonedds_macros::Topicable) handles the common case;
/// implement manually when you need control over the key type or type name.
///
/// # Keys
///
/// Every [`Topicable`] type has an associated [`Key`](Topicable::Key) type that
/// uniquely identifies an instance. For unkeyed topics, use any zero-sized type
/// as the key ([`()`](primitive@unit) being the straightforward choice), and
/// all samples will be treated as belonging to a single instance.
///
/// If using the [`derive`](cyclonedds_macros::Topicable) macro, a hidden type
/// gets generated which contains just the fields marked as a key fields. To
/// access this type see the [`Key` type alias](crate::topicable::Key).
///
/// # Examples
///
/// ```
/// #[derive(
/// cyclonedds::Topicable, serde::Serialize, serde::Deserialize, Default, Clone, Debug,
/// )]
/// struct Temperature {
/// #[dds(key)]
/// sensor_id: u32,
/// value: f32,
/// }
/// ```
///
/// Manual implementation:
///
/// ```
/// #[derive(serde::Serialize, serde::Deserialize, Clone, Default, Debug)]
/// struct Temperature {
/// sensor_id: u32,
/// value: f32,
/// }
///
/// impl cyclonedds::Topicable for Temperature {
/// type Key = u32;
///
/// fn from_key(key: &u32) -> Self {
/// Self {
/// sensor_id: *key,
/// value: 0.0,
/// }
/// }
///
/// fn as_key(&self) -> u32 {
/// self.sensor_id
/// }
/// }
/// ```
/// Evaluates to the [`Key`](Topicable::Key) type associated with the
/// [`Topicable`] type `T`.
///
/// # Examples
/// ```
/// use cyclonedds::{Key, Topicable};
///
/// #[derive(Topicable, serde::Serialize, serde::Deserialize, Default, Clone, Debug)]
/// struct Data {
/// #[dds(key)]
/// pub x: i32,
/// #[dds(key)]
/// pub y: i32,
/// pub message: String,
/// }
///
/// let data = Data {
/// x: 1,
/// y: 2,
/// ..Data::default()
/// };
///
/// // Access the `Key` of `Data` via the type alias.
/// let key = Key::<Data> { x: 1, y: 2 };
///
/// // The keys are equal.
/// assert_eq!(key, data.as_key());
/// ```
pub type Key<T> = Key;