use crate::features::IdlFeatures;
use crate::grammar::IdlVersion;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ParserConfig {
pub version: IdlVersion,
pub compat: CompatMode,
pub vendor: VendorExt,
pub profile: Profile,
pub features: IdlFeatures,
}
impl Default for ParserConfig {
fn default() -> Self {
Self {
version: IdlVersion::V4_2,
compat: CompatMode::Strict,
vendor: VendorExt::None,
profile: Profile::DdsExtensible,
features: IdlFeatures::dds_extensible(),
}
}
}
impl ParserConfig {
#[must_use]
pub const fn strict_4_2() -> Self {
Self {
version: IdlVersion::V4_2,
compat: CompatMode::Strict,
vendor: VendorExt::None,
profile: Profile::DdsExtensible,
features: IdlFeatures::dds_extensible(),
}
}
#[must_use]
pub const fn pragmatic_4_2() -> Self {
Self {
version: IdlVersion::V4_2,
compat: CompatMode::Pragmatic,
vendor: VendorExt::None,
profile: Profile::DdsExtensible,
features: IdlFeatures::dds_extensible(),
}
}
#[must_use]
pub const fn plain_dds_4_2() -> Self {
Self {
version: IdlVersion::V4_2,
compat: CompatMode::Strict,
vendor: VendorExt::None,
profile: Profile::DdsBasic,
features: IdlFeatures::dds_basic(),
}
}
#[must_use]
pub const fn full_4_2() -> Self {
Self {
version: IdlVersion::V4_2,
compat: CompatMode::Strict,
vendor: VendorExt::None,
profile: Profile::Full,
features: IdlFeatures::corba_full(),
}
}
#[must_use]
pub const fn opensplice_legacy() -> Self {
Self {
version: IdlVersion::V4_2,
compat: CompatMode::Pragmatic,
vendor: VendorExt::OpenSplice,
profile: Profile::Full,
features: IdlFeatures::opensplice_legacy(),
}
}
#[must_use]
pub const fn opensplice_modern() -> Self {
Self {
version: IdlVersion::V4_2,
compat: CompatMode::Strict,
vendor: VendorExt::OpenSplice,
profile: Profile::DdsExtensible,
features: IdlFeatures::opensplice_modern(),
}
}
#[must_use]
pub const fn rti_connext() -> Self {
Self {
version: IdlVersion::V4_2,
compat: CompatMode::Strict,
vendor: VendorExt::Rti,
profile: Profile::DdsExtensible,
features: IdlFeatures::rti_connext(),
}
}
#[must_use]
pub const fn cyclonedds() -> Self {
Self {
version: IdlVersion::V4_2,
compat: CompatMode::Strict,
vendor: VendorExt::None,
profile: Profile::DdsExtensible,
features: IdlFeatures::cyclonedds(),
}
}
#[must_use]
pub const fn fastdds() -> Self {
Self {
version: IdlVersion::V4_2,
compat: CompatMode::Strict,
vendor: VendorExt::None,
profile: Profile::DdsExtensible,
features: IdlFeatures::fastdds(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum CompatMode {
#[default]
Strict,
Pragmatic,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum Profile {
DdsBasic,
#[default]
DdsExtensible,
Full,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
pub enum VendorExt {
#[default]
None,
Rti,
OpenSplice,
CycloneDds,
FastDds,
}
#[cfg(test)]
mod tests {
#![allow(clippy::expect_used)]
use super::*;
#[test]
fn default_is_strict_4_2_no_vendor() {
let cfg = ParserConfig::default();
assert_eq!(cfg.version, IdlVersion::V4_2);
assert_eq!(cfg.compat, CompatMode::Strict);
assert_eq!(cfg.vendor, VendorExt::None);
}
#[test]
fn strict_4_2_constructor_matches_default() {
assert_eq!(ParserConfig::strict_4_2(), ParserConfig::default());
}
#[test]
fn pragmatic_4_2_keeps_version_and_no_vendor() {
let cfg = ParserConfig::pragmatic_4_2();
assert_eq!(cfg.version, IdlVersion::V4_2);
assert_eq!(cfg.compat, CompatMode::Pragmatic);
assert_eq!(cfg.vendor, VendorExt::None);
}
#[test]
fn config_is_copyable() {
let cfg = ParserConfig::default();
let copy = cfg;
assert_eq!(cfg, copy);
}
#[test]
fn compat_mode_default_is_strict() {
assert_eq!(CompatMode::default(), CompatMode::Strict);
}
#[test]
fn vendor_ext_default_is_none() {
assert_eq!(VendorExt::default(), VendorExt::None);
}
#[test]
fn config_can_be_customized_field_by_field() {
let cfg = ParserConfig {
version: IdlVersion::V4_0,
compat: CompatMode::Pragmatic,
vendor: VendorExt::Rti,
profile: Profile::Full,
features: IdlFeatures::corba_full(),
};
assert_eq!(cfg.version, IdlVersion::V4_0);
assert_eq!(cfg.compat, CompatMode::Pragmatic);
assert_eq!(cfg.vendor, VendorExt::Rti);
assert_eq!(cfg.profile, Profile::Full);
assert!(cfg.features.corba_components);
}
#[test]
fn opensplice_legacy_constructor_enables_corba_and_pragmas() {
let cfg = ParserConfig::opensplice_legacy();
assert!(cfg.features.vendor_opensplice_legacy);
assert!(cfg.features.corba_value_types_full);
assert!(cfg.features.corba_components);
assert_eq!(cfg.vendor, VendorExt::OpenSplice);
}
#[test]
fn rti_connext_constructor() {
let cfg = ParserConfig::rti_connext();
assert!(cfg.features.vendor_rti);
assert_eq!(cfg.vendor, VendorExt::Rti);
assert!(!cfg.features.corba_components);
}
#[test]
fn cyclonedds_constructor() {
let cfg = ParserConfig::cyclonedds();
assert!(cfg.features.vendor_cyclonedds);
assert!(!cfg.features.vendor_rti);
}
#[test]
fn fastdds_constructor() {
let cfg = ParserConfig::fastdds();
assert!(cfg.features.vendor_fastdds);
assert!(!cfg.features.vendor_opensplice);
}
#[test]
fn default_profile_is_dds_extensible() {
assert_eq!(ParserConfig::default().profile, Profile::DdsExtensible);
assert_eq!(Profile::default(), Profile::DdsExtensible);
}
#[test]
fn plain_dds_profile_constructor() {
let cfg = ParserConfig::plain_dds_4_2();
assert_eq!(cfg.profile, Profile::DdsBasic);
assert_eq!(cfg.compat, CompatMode::Strict);
assert_eq!(cfg.vendor, VendorExt::None);
}
#[test]
fn full_profile_constructor() {
let cfg = ParserConfig::full_4_2();
assert_eq!(cfg.profile, Profile::Full);
}
#[test]
fn strict_pragmatic_use_extensible_profile() {
assert_eq!(ParserConfig::strict_4_2().profile, Profile::DdsExtensible);
assert_eq!(
ParserConfig::pragmatic_4_2().profile,
Profile::DdsExtensible
);
}
}