autosar_data_abstraction/software_component/interface/
senderreceiver.rsuse crate::{
abstraction_element, datatype::AbstractAutosarDataType, software_component::AbstractPortInterface,
AbstractionElement, ArPackage, AutosarAbstractionError, Element,
};
use autosar_data::ElementName;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct SenderReceiverInterface(pub(crate) Element);
abstraction_element!(SenderReceiverInterface, SenderReceiverInterface);
impl AbstractPortInterface for SenderReceiverInterface {}
impl SenderReceiverInterface {
pub(crate) fn new(name: &str, package: &ArPackage) -> Result<Self, AutosarAbstractionError> {
let elements = package.element().get_or_create_sub_element(ElementName::Elements)?;
let sender_receiver_interface =
elements.create_named_sub_element(ElementName::SenderReceiverInterface, name)?;
Ok(Self(sender_receiver_interface))
}
pub fn create_data_element<T: AbstractAutosarDataType>(
&self,
name: &str,
data_type: &T,
) -> Result<VariableDataPrototype, AutosarAbstractionError> {
let data_elements = self.element().get_or_create_sub_element(ElementName::DataElements)?;
VariableDataPrototype::new(name, &data_elements, data_type.element())
}
pub fn data_elements(&self) -> impl Iterator<Item = VariableDataPrototype> {
self.element()
.get_sub_element(ElementName::DataElements)
.into_iter()
.flat_map(|data_elements| data_elements.sub_elements())
.filter_map(|elem| VariableDataPrototype::try_from(elem).ok())
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct VariableDataPrototype(Element);
abstraction_element!(VariableDataPrototype, VariableDataPrototype);
impl VariableDataPrototype {
fn new(name: &str, parent_element: &Element, data_type: &Element) -> Result<Self, AutosarAbstractionError> {
let vdp = parent_element.create_named_sub_element(ElementName::VariableDataPrototype, name)?;
vdp.create_sub_element(ElementName::TypeTref)?
.set_reference_target(data_type)?;
Ok(Self(vdp))
}
pub fn interface(&self) -> Result<SenderReceiverInterface, AutosarAbstractionError> {
let named_parent = self.element().named_parent()?.unwrap();
SenderReceiverInterface::try_from(named_parent)
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::datatype::{BaseTypeEncoding, ImplementationDataTypeSettings};
use autosar_data::{AutosarModel, AutosarVersion};
#[test]
fn sender_receiver_interface() {
let model = AutosarModel::new();
let _file = model.create_file("filename", AutosarVersion::LATEST).unwrap();
let package = ArPackage::get_or_create(&model, "/package").unwrap();
let sr_interface = package
.create_sender_receiver_interface("SenderReceiverInterface")
.unwrap();
let base_type = package
.create_sw_base_type("base", 32, BaseTypeEncoding::None, None, None, None)
.unwrap();
let impl_settings = ImplementationDataTypeSettings::Value {
name: "ImplementationValue".to_string(),
base_type,
compu_method: None,
data_constraint: None,
};
let datatype = package.create_implementation_data_type(impl_settings).unwrap();
let data_element = sr_interface.create_data_element("data_element", &datatype).unwrap();
assert_eq!(sr_interface.data_elements().count(), 1);
assert_eq!(data_element.interface().unwrap(), sr_interface);
}
}