1use crate::facet::Facets;
11use crate::node::AnyId;
12use crate::node::type_::TypeNode;
13use alloc::string::String;
14use alloc::vec::Vec;
15use zerodds_ast_core::{Id, NodeId, Ref};
16
17#[derive(Debug, Clone, PartialEq, Eq)]
20pub struct LibraryNode {
21 pub node_id: NodeId,
23 pub name: String,
25 pub children: Vec<AnyId>,
27 pub facets: Facets,
29}
30
31#[derive(Debug, Clone, PartialEq, Eq)]
33pub struct DomainNode {
34 pub node_id: NodeId,
36 pub name: String,
38 pub domain_id: u32,
40 pub topics: Vec<Id<TopicNode>>,
42 pub parent: Id<LibraryNode>,
44 pub facets: Facets,
46}
47
48#[derive(Debug, Clone, PartialEq, Eq)]
50pub struct TopicNode {
51 pub node_id: NodeId,
53 pub name: String,
55 pub type_: Ref<TypeNode>,
57 pub qos: Option<Ref<QosProfileNode>>,
59 pub parent: Id<DomainNode>,
61 pub facets: Facets,
63}
64
65#[derive(Debug, Clone, PartialEq, Eq)]
67pub struct QosProfileNode {
68 pub node_id: NodeId,
70 pub name: String,
72 pub base: Option<Ref<QosProfileNode>>,
74 pub policies: Vec<QosPolicy>,
76 pub parent: Id<LibraryNode>,
78 pub facets: Facets,
80}
81
82#[derive(Debug, Clone, PartialEq, Eq)]
84pub struct ParticipantNode {
85 pub node_id: NodeId,
87 pub name: String,
89 pub domain: Ref<DomainNode>,
91 pub qos: Option<Ref<QosProfileNode>>,
93 pub endpoints: Vec<Id<EndpointNode>>,
95 pub parent: Id<LibraryNode>,
97 pub facets: Facets,
99}
100
101#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
103pub enum EndpointRole {
104 DataWriter,
106 DataReader,
108}
109
110impl EndpointRole {
111 pub const ALL: [Self; 2] = [Self::DataWriter, Self::DataReader];
113}
114
115#[derive(Debug, Clone, PartialEq, Eq)]
117pub struct EndpointNode {
118 pub node_id: NodeId,
120 pub name: String,
122 pub role: EndpointRole,
124 pub topic: Ref<TopicNode>,
126 pub qos: Option<Ref<QosProfileNode>>,
128 pub parent: Id<ParticipantNode>,
130 pub facets: Facets,
132}
133
134#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
136pub struct Duration {
137 pub sec: i32,
139 pub nanosec: u32,
141}
142
143impl Duration {
144 pub const INFINITE: Self = Self {
146 sec: 0x7fff_ffff,
147 nanosec: 0xffff_ffff,
148 };
149
150 pub const ZERO: Self = Self { sec: 0, nanosec: 0 };
152}
153
154#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
159pub enum QosPolicyKind {
160 UserData,
162 TopicData,
164 GroupData,
166 Durability,
168 DurabilityService,
170 Presentation,
172 Deadline,
174 LatencyBudget,
176 Ownership,
178 OwnershipStrength,
180 Liveliness,
182 TimeBasedFilter,
184 Partition,
186 Reliability,
188 TransportPriority,
190 Lifespan,
192 DestinationOrder,
194 History,
196 ResourceLimits,
198 EntityFactory,
200 WriterDataLifecycle,
202 ReaderDataLifecycle,
204 DataRepresentation,
206 TypeConsistencyEnforcement,
208}
209
210impl QosPolicyKind {
211 pub const ALL: [Self; 24] = [
213 Self::UserData,
214 Self::TopicData,
215 Self::GroupData,
216 Self::Durability,
217 Self::DurabilityService,
218 Self::Presentation,
219 Self::Deadline,
220 Self::LatencyBudget,
221 Self::Ownership,
222 Self::OwnershipStrength,
223 Self::Liveliness,
224 Self::TimeBasedFilter,
225 Self::Partition,
226 Self::Reliability,
227 Self::TransportPriority,
228 Self::Lifespan,
229 Self::DestinationOrder,
230 Self::History,
231 Self::ResourceLimits,
232 Self::EntityFactory,
233 Self::WriterDataLifecycle,
234 Self::ReaderDataLifecycle,
235 Self::DataRepresentation,
236 Self::TypeConsistencyEnforcement,
237 ];
238}
239
240#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
242pub enum DurabilityKind {
243 Volatile,
245 TransientLocal,
247 Transient,
249 Persistent,
251}
252
253#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
255pub enum ReliabilityKind {
256 BestEffort,
258 Reliable,
260}
261
262#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
264pub enum HistoryKind {
265 KeepLast,
267 KeepAll,
269}
270
271#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
273pub enum OwnershipKind {
274 Shared,
276 Exclusive,
278}
279
280#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
282pub enum LivelinessKind {
283 Automatic,
285 ManualByParticipant,
287 ManualByTopic,
289}
290
291#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
293pub enum DestinationOrderKind {
294 ByReceptionTimestamp,
296 BySourceTimestamp,
298}
299
300#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
302pub enum PresentationAccessScope {
303 Instance,
305 Topic,
307 Group,
309}
310
311#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
313pub enum DataRepresentationId {
314 Xcdr1,
316 Xml,
318 Xcdr2,
320}
321
322#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
324pub enum TypeConsistencyKind {
325 DisallowTypeCoercion,
327 AllowTypeCoercion,
329}
330
331#[derive(Debug, Clone, PartialEq, Eq)]
338#[non_exhaustive]
339pub enum QosPolicy {
340 UserData {
342 value: Vec<u8>,
344 },
345 TopicData {
347 value: Vec<u8>,
349 },
350 GroupData {
352 value: Vec<u8>,
354 },
355 Durability {
357 kind: Option<DurabilityKind>,
359 },
360 DurabilityService {
362 service_cleanup_delay: Option<Duration>,
364 history_kind: Option<HistoryKind>,
366 history_depth: Option<i32>,
368 max_samples: Option<i32>,
370 max_instances: Option<i32>,
372 max_samples_per_instance: Option<i32>,
374 },
375 Presentation {
377 access_scope: Option<PresentationAccessScope>,
379 coherent_access: Option<bool>,
381 ordered_access: Option<bool>,
383 },
384 Deadline {
386 period: Option<Duration>,
388 },
389 LatencyBudget {
391 duration: Option<Duration>,
393 },
394 Ownership {
396 kind: Option<OwnershipKind>,
398 },
399 OwnershipStrength {
401 value: Option<i32>,
403 },
404 Liveliness {
406 kind: Option<LivelinessKind>,
408 lease_duration: Option<Duration>,
410 },
411 TimeBasedFilter {
413 minimum_separation: Option<Duration>,
415 },
416 Partition {
418 name: Vec<String>,
420 },
421 Reliability {
423 kind: Option<ReliabilityKind>,
425 max_blocking_time: Option<Duration>,
427 },
428 TransportPriority {
430 value: Option<i32>,
432 },
433 Lifespan {
435 duration: Option<Duration>,
437 },
438 DestinationOrder {
440 kind: Option<DestinationOrderKind>,
442 },
443 History {
445 kind: Option<HistoryKind>,
447 depth: Option<i32>,
449 },
450 ResourceLimits {
452 max_samples: Option<i32>,
454 max_instances: Option<i32>,
456 max_samples_per_instance: Option<i32>,
458 },
459 EntityFactory {
461 autoenable_created_entities: Option<bool>,
463 },
464 WriterDataLifecycle {
466 autodispose_unregistered_instances: Option<bool>,
468 },
469 ReaderDataLifecycle {
471 autopurge_nowriter_samples_delay: Option<Duration>,
473 autopurge_disposed_samples_delay: Option<Duration>,
475 },
476 DataRepresentation {
478 value: Vec<DataRepresentationId>,
480 },
481 TypeConsistencyEnforcement {
483 kind: Option<TypeConsistencyKind>,
485 ignore_sequence_bounds: Option<bool>,
487 ignore_string_bounds: Option<bool>,
489 ignore_member_names: Option<bool>,
491 prevent_type_widening: Option<bool>,
493 force_type_validation: Option<bool>,
495 },
496}
497
498impl QosPolicy {
499 #[must_use]
501 pub const fn kind(&self) -> QosPolicyKind {
502 match self {
503 Self::UserData { .. } => QosPolicyKind::UserData,
504 Self::TopicData { .. } => QosPolicyKind::TopicData,
505 Self::GroupData { .. } => QosPolicyKind::GroupData,
506 Self::Durability { .. } => QosPolicyKind::Durability,
507 Self::DurabilityService { .. } => QosPolicyKind::DurabilityService,
508 Self::Presentation { .. } => QosPolicyKind::Presentation,
509 Self::Deadline { .. } => QosPolicyKind::Deadline,
510 Self::LatencyBudget { .. } => QosPolicyKind::LatencyBudget,
511 Self::Ownership { .. } => QosPolicyKind::Ownership,
512 Self::OwnershipStrength { .. } => QosPolicyKind::OwnershipStrength,
513 Self::Liveliness { .. } => QosPolicyKind::Liveliness,
514 Self::TimeBasedFilter { .. } => QosPolicyKind::TimeBasedFilter,
515 Self::Partition { .. } => QosPolicyKind::Partition,
516 Self::Reliability { .. } => QosPolicyKind::Reliability,
517 Self::TransportPriority { .. } => QosPolicyKind::TransportPriority,
518 Self::Lifespan { .. } => QosPolicyKind::Lifespan,
519 Self::DestinationOrder { .. } => QosPolicyKind::DestinationOrder,
520 Self::History { .. } => QosPolicyKind::History,
521 Self::ResourceLimits { .. } => QosPolicyKind::ResourceLimits,
522 Self::EntityFactory { .. } => QosPolicyKind::EntityFactory,
523 Self::WriterDataLifecycle { .. } => QosPolicyKind::WriterDataLifecycle,
524 Self::ReaderDataLifecycle { .. } => QosPolicyKind::ReaderDataLifecycle,
525 Self::DataRepresentation { .. } => QosPolicyKind::DataRepresentation,
526 Self::TypeConsistencyEnforcement { .. } => QosPolicyKind::TypeConsistencyEnforcement,
527 }
528 }
529}