use alloc::string::String;
use alloc::vec::Vec;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum VendorKind {
Rti,
OpenDds,
FastDds,
CoreDx,
}
impl VendorKind {
pub const ALL: [Self; 4] = [Self::Rti, Self::OpenDds, Self::FastDds, Self::CoreDx];
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Rti => "RTI Connext",
Self::OpenDds => "OpenDDS",
Self::FastDds => "Fast DDS",
Self::CoreDx => "CoreDX",
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct RtiFacet {
pub copy_directives: Vec<String>,
pub resolve_name: Option<bool>,
pub top_level: Option<bool>,
pub keylist: Vec<String>,
pub unrecognised: Vec<(String, String)>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct OpenDdsFacet {
pub dcps_data_type: bool,
pub dcps_data_keys: Vec<String>,
pub supports_zero_copy: Option<bool>,
pub unrecognised: Vec<(String, String)>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct FastDdsFacet {
pub xtypes_extensions: Vec<String>,
pub plain_data_type: Option<bool>,
pub unrecognised: Vec<(String, String)>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct CoreDxFacet {
pub key_fields: Vec<String>,
pub unrecognised: Vec<(String, String)>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct VendorFacets {
pub rti: Option<RtiFacet>,
pub open_dds: Option<OpenDdsFacet>,
pub fast_dds: Option<FastDdsFacet>,
pub core_dx: Option<CoreDxFacet>,
}
impl VendorFacets {
#[must_use]
pub const fn is_empty(&self) -> bool {
self.rti.is_none()
&& self.open_dds.is_none()
&& self.fast_dds.is_none()
&& self.core_dx.is_none()
}
#[must_use]
pub fn present(&self) -> Vec<VendorKind> {
let mut out = Vec::new();
if self.rti.is_some() {
out.push(VendorKind::Rti);
}
if self.open_dds.is_some() {
out.push(VendorKind::OpenDds);
}
if self.fast_dds.is_some() {
out.push(VendorKind::FastDds);
}
if self.core_dx.is_some() {
out.push(VendorKind::CoreDx);
}
out
}
}