autosar_data_abstraction/communication/cluster/
mod.rs1use crate::{AbstractionElement, AutosarAbstractionError, IdentifiableAbstractionElement, System};
2use autosar_data::{Element, ElementName};
3
4mod can;
5mod ethernet;
6mod flexray;
7mod lin;
8
9pub use can::*;
10pub use ethernet::*;
11pub use flexray::*;
12pub use lin::*;
13
14pub trait AbstractCluster: AbstractionElement {
18 fn system(&self) -> Option<System> {
20 if let Ok(model) = self.element().model() {
21 let path = self.element().path().ok()?;
22 let refs = model.get_references_to(&path);
23
24 if let Some(system) = refs
25 .iter()
26 .filter_map(autosar_data::WeakElement::upgrade)
27 .filter(|elem| elem.element_name() == ElementName::FibexElementRef)
28 .filter_map(|elem| elem.named_parent().ok().flatten())
29 .find_map(|parent| System::try_from(parent).ok())
30 {
31 return Some(system);
32 }
33 }
34 None
35 }
36}
37
38#[derive(Debug, Clone, PartialEq, Eq)]
43#[non_exhaustive]
44pub enum Cluster {
45 Can(CanCluster),
47 Ethernet(EthernetCluster),
49 FlexRay(FlexrayCluster),
51 Lin(LinCluster),
53 }
55
56impl AbstractionElement for Cluster {
57 fn element(&self) -> &autosar_data::Element {
58 match self {
59 Cluster::Can(cancluster) => cancluster.element(),
60 Cluster::Ethernet(ethcluster) => ethcluster.element(),
61 Cluster::FlexRay(flxcluster) => flxcluster.element(),
62 Cluster::Lin(lincluster) => lincluster.element(),
63 }
64 }
65}
66
67impl IdentifiableAbstractionElement for Cluster {}
68impl AbstractCluster for Cluster {}
69
70impl TryFrom<Element> for Cluster {
71 type Error = AutosarAbstractionError;
72
73 fn try_from(element: Element) -> Result<Self, Self::Error> {
74 match element.element_name() {
75 ElementName::CanCluster => Ok(CanCluster::try_from(element)?.into()),
76 ElementName::EthernetCluster => Ok(EthernetCluster::try_from(element)?.into()),
77 ElementName::FlexrayCluster => Ok(FlexrayCluster::try_from(element)?.into()),
78 ElementName::LinCluster => Ok(LinCluster::try_from(element)?.into()),
79 _ => Err(AutosarAbstractionError::ConversionError {
80 element,
81 dest: "Cluster".to_string(),
82 }),
83 }
84 }
85}
86
87impl From<CanCluster> for Cluster {
88 fn from(value: CanCluster) -> Self {
89 Cluster::Can(value)
90 }
91}
92
93impl From<EthernetCluster> for Cluster {
94 fn from(value: EthernetCluster) -> Self {
95 Cluster::Ethernet(value)
96 }
97}
98
99impl From<FlexrayCluster> for Cluster {
100 fn from(value: FlexrayCluster) -> Self {
101 Cluster::FlexRay(value)
102 }
103}
104
105impl From<LinCluster> for Cluster {
106 fn from(value: LinCluster) -> Self {
107 Cluster::Lin(value)
108 }
109}
110
111#[cfg(test)]
114mod tests {
115 use super::*;
116 use crate::AutosarModelAbstraction;
117 use autosar_data::AutosarVersion;
118
119 #[test]
120 fn cluster_system() {
121 let model = AutosarModelAbstraction::create("test.arxml", AutosarVersion::LATEST);
122 let package = model.get_or_create_package("/Test").unwrap();
123 let system = package
124 .create_system("System", crate::SystemCategory::EcuExtract)
125 .unwrap();
126 let can_cluster = CanCluster::new("CanCluster", &package, None).unwrap();
127
128 assert!(can_cluster.system().is_none());
129 system.create_fibex_element_ref(can_cluster.element()).unwrap();
130 assert_eq!(can_cluster.system().unwrap(), system);
131 }
132
133 #[test]
134 fn cluster_conversion() {
135 let model = AutosarModelAbstraction::create("test.arxml", AutosarVersion::LATEST);
136 let package = model.get_or_create_package("/Test").unwrap();
137 let can_cluster = CanCluster::new("CanCluster", &package, None).unwrap();
138 let ethernet_cluster = EthernetCluster::new("EthernetCluster", &package).unwrap();
139 let flexray_settings = FlexrayClusterSettings::default();
140 let flexray_cluster = FlexrayCluster::new("FlexrayCluster", &package, &flexray_settings).unwrap();
141
142 let can: Cluster = can_cluster.into();
143 let ethernet: Cluster = ethernet_cluster.into();
144 let flexray: Cluster = flexray_cluster.into();
145
146 assert_eq!(can.element().item_name().unwrap(), "CanCluster");
147 assert_eq!(ethernet.element().item_name().unwrap(), "EthernetCluster");
148 assert_eq!(flexray.element().item_name().unwrap(), "FlexrayCluster");
149 }
150}