use crate::facet::Facets;
use crate::node::AnyId;
use crate::node::type_::TypeNode;
use alloc::string::String;
use alloc::vec::Vec;
use zerodds_ast_core::{Id, NodeId, Ref};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LibraryNode {
pub node_id: NodeId,
pub name: String,
pub children: Vec<AnyId>,
pub facets: Facets,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct DomainNode {
pub node_id: NodeId,
pub name: String,
pub domain_id: u32,
pub topics: Vec<Id<TopicNode>>,
pub parent: Id<LibraryNode>,
pub facets: Facets,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TopicNode {
pub node_id: NodeId,
pub name: String,
pub type_: Ref<TypeNode>,
pub qos: Option<Ref<QosProfileNode>>,
pub parent: Id<DomainNode>,
pub facets: Facets,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct QosProfileNode {
pub node_id: NodeId,
pub name: String,
pub base: Option<Ref<QosProfileNode>>,
pub policies: Vec<QosPolicy>,
pub parent: Id<LibraryNode>,
pub facets: Facets,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ParticipantNode {
pub node_id: NodeId,
pub name: String,
pub domain: Ref<DomainNode>,
pub qos: Option<Ref<QosProfileNode>>,
pub endpoints: Vec<Id<EndpointNode>>,
pub parent: Id<LibraryNode>,
pub facets: Facets,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum EndpointRole {
DataWriter,
DataReader,
}
impl EndpointRole {
pub const ALL: [Self; 2] = [Self::DataWriter, Self::DataReader];
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EndpointNode {
pub node_id: NodeId,
pub name: String,
pub role: EndpointRole,
pub topic: Ref<TopicNode>,
pub qos: Option<Ref<QosProfileNode>>,
pub parent: Id<ParticipantNode>,
pub facets: Facets,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Duration {
pub sec: i32,
pub nanosec: u32,
}
impl Duration {
pub const INFINITE: Self = Self {
sec: 0x7fff_ffff,
nanosec: 0xffff_ffff,
};
pub const ZERO: Self = Self { sec: 0, nanosec: 0 };
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum QosPolicyKind {
UserData,
TopicData,
GroupData,
Durability,
DurabilityService,
Presentation,
Deadline,
LatencyBudget,
Ownership,
OwnershipStrength,
Liveliness,
TimeBasedFilter,
Partition,
Reliability,
TransportPriority,
Lifespan,
DestinationOrder,
History,
ResourceLimits,
EntityFactory,
WriterDataLifecycle,
ReaderDataLifecycle,
DataRepresentation,
TypeConsistencyEnforcement,
}
impl QosPolicyKind {
pub const ALL: [Self; 24] = [
Self::UserData,
Self::TopicData,
Self::GroupData,
Self::Durability,
Self::DurabilityService,
Self::Presentation,
Self::Deadline,
Self::LatencyBudget,
Self::Ownership,
Self::OwnershipStrength,
Self::Liveliness,
Self::TimeBasedFilter,
Self::Partition,
Self::Reliability,
Self::TransportPriority,
Self::Lifespan,
Self::DestinationOrder,
Self::History,
Self::ResourceLimits,
Self::EntityFactory,
Self::WriterDataLifecycle,
Self::ReaderDataLifecycle,
Self::DataRepresentation,
Self::TypeConsistencyEnforcement,
];
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DurabilityKind {
Volatile,
TransientLocal,
Transient,
Persistent,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ReliabilityKind {
BestEffort,
Reliable,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum HistoryKind {
KeepLast,
KeepAll,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum OwnershipKind {
Shared,
Exclusive,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum LivelinessKind {
Automatic,
ManualByParticipant,
ManualByTopic,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DestinationOrderKind {
ByReceptionTimestamp,
BySourceTimestamp,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PresentationAccessScope {
Instance,
Topic,
Group,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum DataRepresentationId {
Xcdr1,
Xml,
Xcdr2,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TypeConsistencyKind {
DisallowTypeCoercion,
AllowTypeCoercion,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum QosPolicy {
UserData {
value: Vec<u8>,
},
TopicData {
value: Vec<u8>,
},
GroupData {
value: Vec<u8>,
},
Durability {
kind: Option<DurabilityKind>,
},
DurabilityService {
service_cleanup_delay: Option<Duration>,
history_kind: Option<HistoryKind>,
history_depth: Option<i32>,
max_samples: Option<i32>,
max_instances: Option<i32>,
max_samples_per_instance: Option<i32>,
},
Presentation {
access_scope: Option<PresentationAccessScope>,
coherent_access: Option<bool>,
ordered_access: Option<bool>,
},
Deadline {
period: Option<Duration>,
},
LatencyBudget {
duration: Option<Duration>,
},
Ownership {
kind: Option<OwnershipKind>,
},
OwnershipStrength {
value: Option<i32>,
},
Liveliness {
kind: Option<LivelinessKind>,
lease_duration: Option<Duration>,
},
TimeBasedFilter {
minimum_separation: Option<Duration>,
},
Partition {
name: Vec<String>,
},
Reliability {
kind: Option<ReliabilityKind>,
max_blocking_time: Option<Duration>,
},
TransportPriority {
value: Option<i32>,
},
Lifespan {
duration: Option<Duration>,
},
DestinationOrder {
kind: Option<DestinationOrderKind>,
},
History {
kind: Option<HistoryKind>,
depth: Option<i32>,
},
ResourceLimits {
max_samples: Option<i32>,
max_instances: Option<i32>,
max_samples_per_instance: Option<i32>,
},
EntityFactory {
autoenable_created_entities: Option<bool>,
},
WriterDataLifecycle {
autodispose_unregistered_instances: Option<bool>,
},
ReaderDataLifecycle {
autopurge_nowriter_samples_delay: Option<Duration>,
autopurge_disposed_samples_delay: Option<Duration>,
},
DataRepresentation {
value: Vec<DataRepresentationId>,
},
TypeConsistencyEnforcement {
kind: Option<TypeConsistencyKind>,
ignore_sequence_bounds: Option<bool>,
ignore_string_bounds: Option<bool>,
ignore_member_names: Option<bool>,
prevent_type_widening: Option<bool>,
force_type_validation: Option<bool>,
},
}
impl QosPolicy {
#[must_use]
pub const fn kind(&self) -> QosPolicyKind {
match self {
Self::UserData { .. } => QosPolicyKind::UserData,
Self::TopicData { .. } => QosPolicyKind::TopicData,
Self::GroupData { .. } => QosPolicyKind::GroupData,
Self::Durability { .. } => QosPolicyKind::Durability,
Self::DurabilityService { .. } => QosPolicyKind::DurabilityService,
Self::Presentation { .. } => QosPolicyKind::Presentation,
Self::Deadline { .. } => QosPolicyKind::Deadline,
Self::LatencyBudget { .. } => QosPolicyKind::LatencyBudget,
Self::Ownership { .. } => QosPolicyKind::Ownership,
Self::OwnershipStrength { .. } => QosPolicyKind::OwnershipStrength,
Self::Liveliness { .. } => QosPolicyKind::Liveliness,
Self::TimeBasedFilter { .. } => QosPolicyKind::TimeBasedFilter,
Self::Partition { .. } => QosPolicyKind::Partition,
Self::Reliability { .. } => QosPolicyKind::Reliability,
Self::TransportPriority { .. } => QosPolicyKind::TransportPriority,
Self::Lifespan { .. } => QosPolicyKind::Lifespan,
Self::DestinationOrder { .. } => QosPolicyKind::DestinationOrder,
Self::History { .. } => QosPolicyKind::History,
Self::ResourceLimits { .. } => QosPolicyKind::ResourceLimits,
Self::EntityFactory { .. } => QosPolicyKind::EntityFactory,
Self::WriterDataLifecycle { .. } => QosPolicyKind::WriterDataLifecycle,
Self::ReaderDataLifecycle { .. } => QosPolicyKind::ReaderDataLifecycle,
Self::DataRepresentation { .. } => QosPolicyKind::DataRepresentation,
Self::TypeConsistencyEnforcement { .. } => QosPolicyKind::TypeConsistencyEnforcement,
}
}
}