autosar_data_abstraction/arpackage.rs
1use autosar_data::{AutosarModel, Element, ElementName};
2
3use crate::{
4 AbstractionElement, AutosarAbstractionError, ByteOrder, EcuInstance, IdentifiableAbstractionElement, System,
5 SystemCategory, abstraction_element,
6 communication::{
7 CanCluster, CanFrame, CanTpConfig, ContainerIPdu, DataTransformationSet, DcmIPdu, DoIpTpConfig,
8 EthernetCluster, FlexrayArTpConfig, FlexrayCluster, FlexrayFrame, FlexrayTpConfig, GeneralPurposeIPdu,
9 GeneralPurposePdu, ISignal, ISignalGroup, ISignalIPdu, LinCluster, MultiplexedIPdu, NPdu, NmConfig, NmPdu,
10 RequestResponseDelay, SecuredIPdu, SomeipSdClientEventGroupTimingConfig, SomeipSdClientServiceInstanceConfig,
11 SomeipSdServerEventGroupTimingConfig, SomeipSdServerServiceInstanceConfig, SystemSignal, SystemSignalGroup,
12 },
13 datatype::{
14 ApplicationArrayDataType, ApplicationArraySize, ApplicationDataType, ApplicationPrimitiveCategory,
15 ApplicationPrimitiveDataType, ApplicationRecordDataType, BaseTypeEncoding, CompuMethod, CompuMethodContent,
16 ConstantSpecification, DataConstr, DataTypeMappingSet, ImplementationDataType, ImplementationDataTypeSettings,
17 SwBaseType, Unit, ValueSpecification,
18 },
19 ecu_configuration::{
20 EcucDefinitionCollection, EcucDestinationUriDefSet, EcucModuleConfigurationValues, EcucModuleDef,
21 EcucValueCollection,
22 },
23 software_component::{
24 ApplicationSwComponentType, ClientServerInterface, ComplexDeviceDriverSwComponentType,
25 CompositionSwComponentType, EcuAbstractionSwComponentType, ModeDeclarationGroup, ModeDeclarationGroupCategory,
26 ModeSwitchInterface, NvDataInterface, ParameterInterface, SenderReceiverInterface,
27 SensorActuatorSwComponentType, ServiceSwComponentType, TriggerInterface,
28 },
29};
30
31/// An `ArPackage` is an Autosar package, which can contain other packages or elements
32#[derive(Debug, Clone, PartialEq, Eq, Hash)]
33pub struct ArPackage(Element);
34abstraction_element!(ArPackage, ArPackage);
35impl IdentifiableAbstractionElement for ArPackage {}
36
37impl ArPackage {
38 /// Get or create an autosar package for the given path
39 ///
40 /// # Example
41 ///
42 /// ```
43 /// # use autosar_data::*;
44 /// # use autosar_data_abstraction::*;
45 /// # fn main() -> Result<(), AutosarAbstractionError> {
46 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
47 /// let package = model.get_or_create_package("/pkg1")?;
48 /// # Ok(())}
49 /// ```
50 ///
51 /// # Errors
52 ///
53 /// - [`AutosarAbstractionError::InvalidPath`] The value in `package_path` was not an Autosar path
54 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model
55 pub(crate) fn get_or_create(model: &AutosarModel, package_path: &str) -> Result<Self, AutosarAbstractionError> {
56 if let Some(pkg_elem) = model.get_element_by_path(package_path) {
57 pkg_elem.try_into()
58 } else {
59 let mut parts_iter = package_path.split('/');
60 if !parts_iter.next().unwrap_or("-").is_empty() {
61 return Err(AutosarAbstractionError::InvalidPath(package_path.to_string()));
62 }
63 let mut pkg_elem = model.root_element();
64 for part in parts_iter {
65 pkg_elem = pkg_elem
66 .get_or_create_sub_element(ElementName::ArPackages)?
67 .get_or_create_named_sub_element(ElementName::ArPackage, part)?;
68 }
69 pkg_elem.try_into()
70 }
71 }
72
73 /// remove this `ArPackage` from the model
74 pub fn remove(self, deep: bool) -> Result<(), AutosarAbstractionError> {
75 for sub_package in self.sub_packages() {
76 sub_package.remove(deep)?;
77 }
78
79 // give all elements the chance to clean up their cross-references
80 for element in self.elements() {
81 match element.element_name() {
82 ElementName::ApplicationArrayDataType => {
83 let app_array_data_type = ApplicationArrayDataType::try_from(element)?;
84 app_array_data_type.remove(deep)?;
85 }
86 ElementName::ApplicationPrimitiveDataType => {
87 let app_prim_data_type = ApplicationPrimitiveDataType::try_from(element)?;
88 app_prim_data_type.remove(deep)?;
89 }
90 ElementName::ApplicationRecordDataType => {
91 let app_record_data_type = ApplicationRecordDataType::try_from(element)?;
92 app_record_data_type.remove(deep)?;
93 }
94 ElementName::ApplicationSwComponentType => {
95 let app_sw_comp_type = ApplicationSwComponentType::try_from(element)?;
96 app_sw_comp_type.remove(deep)?;
97 }
98 ElementName::CanCluster => {
99 let can_cluster = CanCluster::try_from(element)?;
100 can_cluster.remove(deep)?;
101 }
102 ElementName::CanFrame => {
103 let can_frame = CanFrame::try_from(element)?;
104 can_frame.remove(deep)?;
105 }
106 ElementName::CanTpConfig => {
107 let can_tp_config = CanTpConfig::try_from(element)?;
108 can_tp_config.remove(deep)?;
109 }
110 ElementName::ClientServerInterface => {
111 let client_server_interface = ClientServerInterface::try_from(element)?;
112 client_server_interface.remove(deep)?;
113 }
114 ElementName::ComplexDeviceDriverSwComponentType => {
115 let complex_device_driver_sw_component_type =
116 ComplexDeviceDriverSwComponentType::try_from(element)?;
117 complex_device_driver_sw_component_type.remove(deep)?;
118 }
119 ElementName::CompositionSwComponentType => {
120 let composition_sw_component_type = CompositionSwComponentType::try_from(element)?;
121 composition_sw_component_type.remove(deep)?;
122 }
123 ElementName::CompuMethod => {
124 let compu_method = CompuMethod::try_from(element)?;
125 compu_method.remove(deep)?;
126 }
127 ElementName::ConstantSpecification => {
128 let constant_specification = ConstantSpecification::try_from(element)?;
129 constant_specification.remove(deep)?;
130 }
131 ElementName::ContainerIPdu => {
132 let container_ipdu = ContainerIPdu::try_from(element)?;
133 container_ipdu.remove(deep)?;
134 }
135 ElementName::DataConstr => {
136 let data_constr = DataConstr::try_from(element)?;
137 data_constr.remove(deep)?;
138 }
139 ElementName::DataTransformationSet => {
140 let data_transformation_set = DataTransformationSet::try_from(element)?;
141 data_transformation_set.remove(deep)?;
142 }
143 ElementName::DataTypeMappingSet => {
144 let data_type_mapping_set = DataTypeMappingSet::try_from(element)?;
145 data_type_mapping_set.remove(deep)?;
146 }
147 ElementName::DcmIPdu => {
148 let dcm_ipdu = DcmIPdu::try_from(element)?;
149 dcm_ipdu.remove(deep)?;
150 }
151 ElementName::DoIpTpConfig => {
152 let doip_tp_config = DoIpTpConfig::try_from(element)?;
153 doip_tp_config.remove(deep)?;
154 }
155 ElementName::EcuAbstractionSwComponentType => {
156 let ecu_abstraction_sw_component_type = EcuAbstractionSwComponentType::try_from(element)?;
157 ecu_abstraction_sw_component_type.remove(deep)?;
158 }
159 ElementName::EcucDefinitionCollection => {
160 let ecuc_definition_collection = EcucDefinitionCollection::try_from(element)?;
161 ecuc_definition_collection.remove(deep)?;
162 }
163 ElementName::EcucDestinationUriDefSet => {
164 let ecuc_destination_uri_def_set = EcucDestinationUriDefSet::try_from(element)?;
165 ecuc_destination_uri_def_set.remove(deep)?;
166 }
167 ElementName::EcuInstance => {
168 let ecu_instance = EcuInstance::try_from(element)?;
169 ecu_instance.remove(deep)?;
170 }
171 ElementName::EcucModuleConfigurationValues => {
172 let ecuc_module_configuration_values = EcucModuleConfigurationValues::try_from(element)?;
173 ecuc_module_configuration_values.remove(deep)?;
174 }
175 ElementName::EcucModuleDef => {
176 let ecuc_module_def = EcucModuleDef::try_from(element)?;
177 ecuc_module_def.remove(deep)?;
178 }
179 ElementName::EcucValueCollection => {
180 let ecuc_value_collection = EcucValueCollection::try_from(element)?;
181 ecuc_value_collection.remove(deep)?;
182 }
183 ElementName::EthernetCluster => {
184 let ethernet_cluster = EthernetCluster::try_from(element)?;
185 ethernet_cluster.remove(deep)?;
186 }
187 ElementName::FlexrayArTpConfig => {
188 let flexray_ar_tp_config = FlexrayArTpConfig::try_from(element)?;
189 flexray_ar_tp_config.remove(deep)?;
190 }
191 ElementName::FlexrayCluster => {
192 let flexray_cluster = FlexrayCluster::try_from(element)?;
193 flexray_cluster.remove(deep)?;
194 }
195 ElementName::FlexrayFrame => {
196 let flexray_frame = FlexrayFrame::try_from(element)?;
197 flexray_frame.remove(deep)?;
198 }
199 ElementName::FlexrayTpConfig => {
200 let flexray_tp_config = FlexrayTpConfig::try_from(element)?;
201 flexray_tp_config.remove(deep)?;
202 }
203 ElementName::GeneralPurposeIPdu => {
204 let general_purpose_ipdu = GeneralPurposeIPdu::try_from(element)?;
205 general_purpose_ipdu.remove(deep)?;
206 }
207 ElementName::GeneralPurposePdu => {
208 let general_purpose_pdu = GeneralPurposePdu::try_from(element)?;
209 general_purpose_pdu.remove(deep)?;
210 }
211 ElementName::ImplementationDataType => {
212 let implementation_data_type = ImplementationDataType::try_from(element)?;
213 implementation_data_type.remove(deep)?;
214 }
215 ElementName::ISignal => {
216 let i_signal = ISignal::try_from(element)?;
217 i_signal.remove(deep)?;
218 }
219 ElementName::ISignalGroup => {
220 let i_signal_group = ISignalGroup::try_from(element)?;
221 i_signal_group.remove(deep)?;
222 }
223 ElementName::ISignalIPdu => {
224 let i_signal_ipdu = ISignalIPdu::try_from(element)?;
225 i_signal_ipdu.remove(deep)?;
226 }
227 ElementName::LinCluster => {
228 let lin_cluster = LinCluster::try_from(element)?;
229 lin_cluster.remove(deep)?;
230 }
231 ElementName::ModeDeclarationGroup => {
232 let mode_declaration_group = ModeDeclarationGroup::try_from(element)?;
233 mode_declaration_group.remove(deep)?;
234 }
235 ElementName::ModeSwitchInterface => {
236 let mode_switch_interface = ModeSwitchInterface::try_from(element)?;
237 mode_switch_interface.remove(deep)?;
238 }
239 ElementName::MultiplexedIPdu => {
240 let multiplexed_ipdu = MultiplexedIPdu::try_from(element)?;
241 multiplexed_ipdu.remove(deep)?;
242 }
243 ElementName::NmConfig => {
244 let nm_config = NmConfig::try_from(element)?;
245 nm_config.remove(deep)?;
246 }
247 ElementName::NmPdu => {
248 let nm_pdu = NmPdu::try_from(element)?;
249 nm_pdu.remove(deep)?;
250 }
251 ElementName::NPdu => {
252 let n_pdu = NPdu::try_from(element)?;
253 n_pdu.remove(deep)?;
254 }
255 ElementName::NvDataInterface => {
256 let nv_data_interface = NvDataInterface::try_from(element)?;
257 nv_data_interface.remove(deep)?;
258 }
259 ElementName::ParameterInterface => {
260 let parameter_interface = ParameterInterface::try_from(element)?;
261 parameter_interface.remove(deep)?;
262 }
263 ElementName::SecuredIPdu => {
264 let secured_ipdu = SecuredIPdu::try_from(element)?;
265 secured_ipdu.remove(deep)?;
266 }
267 ElementName::SenderReceiverInterface => {
268 let sender_receiver_interface = SenderReceiverInterface::try_from(element)?;
269 sender_receiver_interface.remove(deep)?;
270 }
271 ElementName::SensorActuatorSwComponentType => {
272 let sensor_actuator_sw_component_type = SensorActuatorSwComponentType::try_from(element)?;
273 sensor_actuator_sw_component_type.remove(deep)?;
274 }
275 ElementName::ServiceSwComponentType => {
276 let service_sw_component_type = ServiceSwComponentType::try_from(element)?;
277 service_sw_component_type.remove(deep)?;
278 }
279 ElementName::SomeipSdClientEventGroupTimingConfig => {
280 let someip_sd_client_event_group_timing_config =
281 SomeipSdClientEventGroupTimingConfig::try_from(element)?;
282 someip_sd_client_event_group_timing_config.remove(deep)?;
283 }
284 ElementName::SomeipSdClientServiceInstanceConfig => {
285 let someip_sd_client_service_instance_config =
286 SomeipSdClientServiceInstanceConfig::try_from(element)?;
287 someip_sd_client_service_instance_config.remove(deep)?;
288 }
289 ElementName::SomeipSdServerEventGroupTimingConfig => {
290 let someip_sd_server_event_group_timing_config =
291 SomeipSdServerEventGroupTimingConfig::try_from(element)?;
292 someip_sd_server_event_group_timing_config.remove(deep)?;
293 }
294 ElementName::SomeipSdServerServiceInstanceConfig => {
295 let someip_sd_server_service_instance_config =
296 SomeipSdServerServiceInstanceConfig::try_from(element)?;
297 someip_sd_server_service_instance_config.remove(deep)?;
298 }
299 ElementName::SwBaseType => {
300 let sw_base_type = SwBaseType::try_from(element)?;
301 sw_base_type.remove(deep)?;
302 }
303 ElementName::System => {
304 let system = System::try_from(element)?;
305 system.remove(deep)?;
306 }
307 ElementName::SystemSignal => {
308 let system_signal = SystemSignal::try_from(element)?;
309 system_signal.remove(deep)?;
310 }
311 ElementName::SystemSignalGroup => {
312 let system_signal_group = SystemSignalGroup::try_from(element)?;
313 system_signal_group.remove(deep)?;
314 }
315 ElementName::TriggerInterface => {
316 let trigger_interface = TriggerInterface::try_from(element)?;
317 trigger_interface.remove(deep)?;
318 }
319 ElementName::Unit => {
320 let unit = Unit::try_from(element)?;
321 unit.remove(deep)?;
322 }
323 _ => {}
324 }
325 }
326
327 AbstractionElement::remove(self, deep)
328 }
329
330 /// create a new `ApplicationArrayDataType` in the package
331 ///
332 /// # Example
333 ///
334 /// ```
335 /// # use autosar_data::*;
336 /// # use autosar_data_abstraction::{*, datatype::*};
337 /// # fn main() -> Result<(), AutosarAbstractionError> {
338 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
339 /// let package = model.get_or_create_package("/some/package")?;
340 /// let element_type = package.create_application_primitive_data_type("ElementType", ApplicationPrimitiveCategory::Value, None, None, None)?;
341 /// let data_type = package.create_application_array_data_type("ArrayDataType", &element_type, ApplicationArraySize::Fixed(4))?;
342 /// assert!(model.get_element_by_path("/some/package/ArrayDataType").is_some());
343 /// # Ok(())}
344 /// ```
345 ///
346 /// # Errors
347 ///
348 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the APPLICATION-ARRAY-DATA-TYPE element
349 pub fn create_application_array_data_type<T: Into<ApplicationDataType> + AbstractionElement>(
350 &self,
351 name: &str,
352 element_type: &T,
353 size: ApplicationArraySize,
354 ) -> Result<ApplicationArrayDataType, AutosarAbstractionError> {
355 ApplicationArrayDataType::new(name, self, element_type, size)
356 }
357
358 /// create a new `ApplicationPrimitiveDataType` in the package
359 ///
360 /// # Example
361 ///
362 /// ```
363 /// # use autosar_data::*;
364 /// # use autosar_data_abstraction::{*, datatype::*};
365 /// # fn main() -> Result<(), AutosarAbstractionError> {
366 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
367 /// let package = model.get_or_create_package("/some/package")?;
368 /// let data_type = package.create_application_primitive_data_type("ApplicationPrimitiveDataType", ApplicationPrimitiveCategory::Value, None, None, None)?;
369 /// assert!(model.get_element_by_path("/some/package/ApplicationPrimitiveDataType").is_some());
370 /// # Ok(())}
371 /// ```
372 ///
373 /// # Errors
374 ///
375 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the APPLICATION-PRIMITIVE-DATA-TYPE element
376 pub fn create_application_primitive_data_type(
377 &self,
378 name: &str,
379 category: ApplicationPrimitiveCategory,
380 compu_method: Option<&CompuMethod>,
381 unit: Option<&Unit>,
382 data_constraint: Option<&DataConstr>,
383 ) -> Result<ApplicationPrimitiveDataType, AutosarAbstractionError> {
384 ApplicationPrimitiveDataType::new(name, self, category, compu_method, unit, data_constraint)
385 }
386
387 /// create a new `ApplicationRecordDataType` in the package
388 ///
389 /// # Example
390 ///
391 /// ```
392 /// # use autosar_data::*;
393 /// # use autosar_data_abstraction::{*, datatype::*};
394 /// # fn main() -> Result<(), AutosarAbstractionError> {
395 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
396 /// let package = model.get_or_create_package("/some/package")?;
397 /// let data_type = package.create_application_record_data_type("ApplicationRecordDataType")?;
398 /// assert!(model.get_element_by_path("/some/package/ApplicationRecordDataType").is_some());
399 /// # Ok(())}
400 /// ```
401 ///
402 /// # Errors
403 ///
404 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the APPLICATION-RECORD-DATA-TYPE element
405 pub fn create_application_record_data_type(
406 &self,
407 name: &str,
408 ) -> Result<ApplicationRecordDataType, AutosarAbstractionError> {
409 ApplicationRecordDataType::new(name, self)
410 }
411
412 /// create a new `ApplicationSwComponentType` in the package
413 ///
414 /// # Example
415 ///
416 /// ```
417 /// # use autosar_data::*;
418 /// # use autosar_data_abstraction::*;
419 /// # fn main() -> Result<(), AutosarAbstractionError> {
420 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
421 /// let package = model.get_or_create_package("/some/package")?;
422 /// let component = package.create_application_sw_component_type("MyComponent")?;
423 /// assert!(model.get_element_by_path("/some/package/MyComponent").is_some());
424 /// # Ok(())}
425 /// ```
426 ///
427 /// # Errors
428 ///
429 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the APPLICATION-SW-COMPONENT-TYPE element
430 pub fn create_application_sw_component_type(
431 &self,
432 name: &str,
433 ) -> Result<ApplicationSwComponentType, AutosarAbstractionError> {
434 ApplicationSwComponentType::new(name, self)
435 }
436
437 /// create a new `ClientServerInterface` in the package
438 ///
439 /// # Example
440 ///
441 /// ```
442 /// # use autosar_data::*;
443 /// # use autosar_data_abstraction::*;
444 /// # fn main() -> Result<(), AutosarAbstractionError> {
445 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
446 /// let package = model.get_or_create_package("/some/package")?;
447 /// let interface = package.create_client_server_interface("ClientServerInterface")?;
448 /// assert!(model.get_element_by_path("/some/package/ClientServerInterface").is_some());
449 /// # Ok(())}
450 /// ```
451 ///
452 /// # Errors
453 ///
454 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the CLIENT-SERVER-INTERFACE element
455 pub fn create_client_server_interface(&self, name: &str) -> Result<ClientServerInterface, AutosarAbstractionError> {
456 ClientServerInterface::new(name, self)
457 }
458
459 /// create a new `ComplexDeviceDriverSwComponentType` in the package
460 ///
461 /// # Example
462 ///
463 /// ```
464 /// # use autosar_data::*;
465 /// # use autosar_data_abstraction::*;
466 /// # fn main() -> Result<(), AutosarAbstractionError> {
467 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
468 /// let package = model.get_or_create_package("/some/package")?;
469 /// let component = package.create_complex_device_driver_sw_component_type("ComplexDeviceDriverSwComponentType")?;
470 /// assert!(model.get_element_by_path("/some/package/ComplexDeviceDriverSwComponentType").is_some());
471 /// # Ok(())}
472 /// ```
473 ///
474 /// # Errors
475 ///
476 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the COMPLEX-DEVICE-DRIVER-SW-COMPONENT-TYPE element
477 pub fn create_complex_device_driver_sw_component_type(
478 &self,
479 name: &str,
480 ) -> Result<ComplexDeviceDriverSwComponentType, AutosarAbstractionError> {
481 ComplexDeviceDriverSwComponentType::new(name, self)
482 }
483
484 /// create a new `CompositionSwComponentType` in the package
485 ///
486 /// # Example
487 ///
488 /// ```
489 /// # use autosar_data::*;
490 /// # use autosar_data_abstraction::*;
491 /// # fn main() -> Result<(), AutosarAbstractionError> {
492 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
493 /// let package = model.get_or_create_package("/some/package")?;
494 /// let component = package.create_composition_sw_component_type("CompositionSwComponentType")?;
495 /// assert!(model.get_element_by_path("/some/package/CompositionSwComponentType").is_some());
496 /// # Ok(())}
497 /// ```
498 ///
499 /// # Errors
500 ///
501 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the COMPOSITION-SW-COMPONENT-TYPE element
502 pub fn create_composition_sw_component_type(
503 &self,
504 name: &str,
505 ) -> Result<CompositionSwComponentType, AutosarAbstractionError> {
506 CompositionSwComponentType::new(name, self)
507 }
508
509 /// create a new `CompuMethod` in the package
510 ///
511 /// # Example
512 ///
513 /// ```
514 /// # use autosar_data::*;
515 /// # use autosar_data_abstraction::{*, datatype::*};
516 /// # fn main() -> Result<(), AutosarAbstractionError> {
517 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
518 /// let package = model.get_or_create_package("/some/package")?;
519 /// let compu_content = CompuMethodContent::Linear(CompuMethodLinearContent {
520 /// direction: CompuScaleDirection::IntToPhys,
521 /// offset: 0.0,
522 /// factor: 1.0,
523 /// divisor: 1.0,
524 /// lower_limit: None,
525 /// upper_limit: None,
526 /// });
527 /// let compu_method = package.create_compu_method("CompuMethod", compu_content)?;
528 /// assert!(model.get_element_by_path("/some/package/CompuMethod").is_some());
529 /// # Ok(())}
530 /// ```
531 ///
532 /// # Errors
533 ///
534 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the COMPU-METHOD element
535 pub fn create_compu_method(
536 &self,
537 name: &str,
538 content: CompuMethodContent,
539 ) -> Result<CompuMethod, AutosarAbstractionError> {
540 CompuMethod::new(name, self, content)
541 }
542
543 /// create a new `ConstantSpecification` in the package
544 ///
545 /// # Example
546 ///
547 /// ```
548 /// # use autosar_data::*;
549 /// # use autosar_data_abstraction::{*, datatype::*};
550 /// # fn main() -> Result<(), AutosarAbstractionError> {
551 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
552 /// let package = model.get_or_create_package("/some/package")?;
553 /// let value = NumericalValueSpecification {
554 /// label: None,
555 /// value: 42.0,
556 /// };
557 /// let compu_method = package.create_constant_specification("CompuMethod", value)?;
558 /// assert!(model.get_element_by_path("/some/package/CompuMethod").is_some());
559 /// # Ok(())}
560 /// ```
561 ///
562 /// # Errors
563 ///
564 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the CONSTANT-SPECIFICATION element
565 pub fn create_constant_specification<T: Into<ValueSpecification>>(
566 &self,
567 name: &str,
568 value: T,
569 ) -> Result<ConstantSpecification, AutosarAbstractionError> {
570 ConstantSpecification::new(name, self, value.into())
571 }
572
573 /// create a new `DataConstr` in the package
574 ///
575 /// # Example
576 ///
577 /// ```
578 /// # use autosar_data::*;
579 /// # use autosar_data_abstraction::{*, datatype::*};
580 /// # fn main() -> Result<(), AutosarAbstractionError> {
581 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
582 /// let package = model.get_or_create_package("/some/package")?;
583 /// let data_constr = package.create_data_constr("DataConstr")?;
584 /// assert!(model.get_element_by_path("/some/package/DataConstr").is_some());
585 /// # Ok(())}
586 /// ```
587 ///
588 /// # Errors
589 ///
590 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the DATA-CONSTR element
591 pub fn create_data_constr(&self, name: &str) -> Result<DataConstr, AutosarAbstractionError> {
592 DataConstr::new(name, self)
593 }
594
595 /// create a new `DataTransformationSet` in the package
596 ///
597 /// # Example
598 ///
599 /// ```
600 /// # use autosar_data::*;
601 /// # use autosar_data_abstraction::*;
602 /// # fn main() -> Result<(), AutosarAbstractionError> {
603 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
604 /// let package = model.get_or_create_package("/some/package")?;
605 /// let transformation_set = package.create_data_transformation_set("DataTransformationSet")?;
606 /// assert!(model.get_element_by_path("/some/package/DataTransformationSet").is_some());
607 /// # Ok(())}
608 /// ```
609 ///
610 /// # Errors
611 ///
612 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the DATA-TRANSFORMATION-SET element
613 pub fn create_data_transformation_set(&self, name: &str) -> Result<DataTransformationSet, AutosarAbstractionError> {
614 DataTransformationSet::new(name, self)
615 }
616
617 /// create a new `DataTypeMappingSet` in the package
618 ///
619 /// # Example
620 ///
621 /// ```
622 /// # use autosar_data::*;
623 /// # use autosar_data_abstraction::*;
624 /// # fn main() -> Result<(), AutosarAbstractionError> {
625 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
626 /// let package = model.get_or_create_package("/some/package")?;
627 /// let mapping_set = package.create_data_type_mapping_set("DataTypeMappingSet")?;
628 /// assert!(model.get_element_by_path("/some/package/DataTypeMappingSet").is_some());
629 /// # Ok(())}
630 /// ```
631 ///
632 /// # Errors
633 ///
634 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the DATA-TYPE-MAPPING-SET element
635 pub fn create_data_type_mapping_set(&self, name: &str) -> Result<DataTypeMappingSet, AutosarAbstractionError> {
636 DataTypeMappingSet::new(name, self)
637 }
638
639 /// create a new `EcuAbstractionSwComponentType` in the package
640 ///
641 /// # Example
642 ///
643 /// ```
644 /// # use autosar_data::*;
645 /// # use autosar_data_abstraction::*;
646 /// # fn main() -> Result<(), AutosarAbstractionError> {
647 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
648 /// let package = model.get_or_create_package("/some/package")?;
649 /// let component = package.create_ecu_abstraction_sw_component_type("EcuAbstractionSwComponentType")?;
650 /// assert!(model.get_element_by_path("/some/package/EcuAbstractionSwComponentType").is_some());
651 /// # Ok(())}
652 /// ```
653 ///
654 /// # Errors
655 ///
656 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the ECU-ABSTRACTION-SW-COMPONENT-TYPE element
657 pub fn create_ecu_abstraction_sw_component_type(
658 &self,
659 name: &str,
660 ) -> Result<EcuAbstractionSwComponentType, AutosarAbstractionError> {
661 EcuAbstractionSwComponentType::new(name, self)
662 }
663
664 /// create a new `EcucDefinitionCollection` in the package
665 ///
666 /// # Example
667 ///
668 /// ```
669 /// # use autosar_data::*;
670 /// # use autosar_data_abstraction::*;
671 /// # fn main() -> Result<(), AutosarAbstractionError> {
672 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::LATEST);
673 /// let package = model.get_or_create_package("/pkg")?;
674 /// let definition_collection = package.create_ecuc_definition_collection("DefinitionCollection")?;
675 /// assert!(model.get_element_by_path("/pkg/DefinitionCollection").is_some());
676 /// # Ok(())}
677 /// ```
678 ///
679 /// # Errors
680 ///
681 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model
682 pub fn create_ecuc_definition_collection(
683 &self,
684 name: &str,
685 ) -> Result<EcucDefinitionCollection, AutosarAbstractionError> {
686 EcucDefinitionCollection::new(name, self)
687 }
688
689 /// create a new `EcucDestinationUriDefSet` in the package
690 ///
691 /// # Example
692 ///
693 /// ```
694 /// # use autosar_data::*;
695 /// # use autosar_data_abstraction::*;
696 /// # fn main() -> Result<(), AutosarAbstractionError> {
697 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::LATEST);
698 /// let package = model.get_or_create_package("/pkg")?;
699 /// let uri_def_set = package.create_ecuc_destination_uri_def_set("DestinationUriDefSet")?;
700 /// assert!(model.get_element_by_path("/pkg/DestinationUriDefSet").is_some());
701 /// # Ok(())}
702 /// ```
703 ///
704 /// # Errors
705 ///
706 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model
707 pub fn create_ecuc_destination_uri_def_set(
708 &self,
709 name: &str,
710 ) -> Result<EcucDestinationUriDefSet, AutosarAbstractionError> {
711 EcucDestinationUriDefSet::new(name, self)
712 }
713
714 /// create a new `EcucModuleConfigurationValues` in the package
715 ///
716 /// # Example
717 ///
718 /// ```
719 /// # use autosar_data::*;
720 /// # use autosar_data_abstraction::*;
721 /// # fn main() -> Result<(), AutosarAbstractionError> {
722 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::LATEST);
723 /// let package = model.get_or_create_package("/pkg")?;
724 /// # let module_definition = package.create_ecuc_module_def("ModuleDef")?;
725 /// let module_config = package.create_ecuc_module_configuration_values("ModuleConfig", &module_definition)?;
726 /// assert!(model.get_element_by_path("/pkg/ModuleConfig").is_some());
727 /// # Ok(())}
728 /// ```
729 ///
730 /// # Errors
731 ///
732 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model
733 pub fn create_ecuc_module_configuration_values(
734 &self,
735 name: &str,
736 definition: &EcucModuleDef,
737 ) -> Result<EcucModuleConfigurationValues, AutosarAbstractionError> {
738 EcucModuleConfigurationValues::new(name, self, definition)
739 }
740
741 /// create a new `EcucModuleDef` in the package
742 ///
743 /// # Example
744 ///
745 /// ```
746 /// # use autosar_data::*;
747 /// # use autosar_data_abstraction::*;
748 /// # fn main() -> Result<(), AutosarAbstractionError> {
749 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::LATEST);
750 /// let package = model.get_or_create_package("/pkg")?;
751 /// let bsw_module = package.create_ecuc_module_def("BswModule")?;
752 /// assert!(model.get_element_by_path("/pkg/BswModule").is_some());
753 /// # Ok(())}
754 /// ```
755 ///
756 /// # Errors
757 ///
758 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model
759 pub fn create_ecuc_module_def(&self, name: &str) -> Result<EcucModuleDef, AutosarAbstractionError> {
760 EcucModuleDef::new(name, self)
761 }
762
763 /// create a new `EcucValueCollection` in the package
764 ///
765 /// # Example
766 ///
767 /// ```
768 /// # use autosar_data::*;
769 /// # use autosar_data_abstraction::*;
770 /// # fn main() -> Result<(), AutosarAbstractionError> {
771 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::LATEST);
772 /// let package = model.get_or_create_package("/pkg")?;
773 /// let value_collection = package.create_ecuc_value_collection("ValueCollection")?;
774 /// assert!(model.get_element_by_path("/pkg/ValueCollection").is_some());
775 /// # Ok(())}
776 /// ```
777 ///
778 /// # Errors
779 ///
780 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model
781 pub fn create_ecuc_value_collection(&self, name: &str) -> Result<EcucValueCollection, AutosarAbstractionError> {
782 EcucValueCollection::new(name, self)
783 }
784
785 /// create a new `ImplementationDataType` in the package
786 ///
787 /// # Example
788 ///
789 /// ```
790 /// # use autosar_data::*;
791 /// # use autosar_data_abstraction::{*, datatype::*};
792 /// # fn main() -> Result<(), AutosarAbstractionError> {
793 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
794 /// let package = model.get_or_create_package("/some/package")?;
795 /// let sw_base_type = package.create_sw_base_type("uint8", 8, BaseTypeEncoding::None, None, None, None)?;
796 /// let settings = ImplementationDataTypeSettings::Value {
797 /// name: "ImplementationDataType_Value".to_string(),
798 /// base_type: sw_base_type,
799 /// compu_method: None,
800 /// data_constraint: None,
801 /// };
802 /// let data_type = package.create_implementation_data_type(&settings)?;
803 /// assert!(model.get_element_by_path("/some/package/ImplementationDataType_Value").is_some());
804 /// # Ok(())}
805 /// ```
806 ///
807 /// # Errors
808 ///
809 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the IMPLEMENTATION-DATA-TYPE element
810 pub fn create_implementation_data_type(
811 &self,
812 settings: &ImplementationDataTypeSettings,
813 ) -> Result<ImplementationDataType, AutosarAbstractionError> {
814 ImplementationDataType::new(self, settings)
815 }
816
817 /// create a new `ModeDeclarationGroup` in the package
818 ///
819 /// # Example
820 ///
821 /// ```
822 /// # use autosar_data::*;
823 /// # use autosar_data_abstraction::*;
824 /// # fn main() -> Result<(), AutosarAbstractionError> {
825 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::LATEST);
826 /// let package = model.get_or_create_package("/some/package")?;
827 /// let mode_declaration_group = package.create_mode_declaration_group("ModeDeclarationGroup", None)?;
828 /// assert!(model.get_element_by_path("/some/package/ModeDeclarationGroup").is_some());
829 /// # Ok(())}
830 /// ```
831 ///
832 /// # Errors
833 ///
834 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the MODE-DECLARATION-GROUP element
835 pub fn create_mode_declaration_group(
836 &self,
837 name: &str,
838 category: Option<ModeDeclarationGroupCategory>,
839 ) -> Result<ModeDeclarationGroup, AutosarAbstractionError> {
840 ModeDeclarationGroup::new(name, self, category)
841 }
842
843 /// create a new `ModeSwitchInterface` in the package
844 ///
845 /// # Example
846 ///
847 /// ```
848 /// # use autosar_data::*;
849 /// # use autosar_data_abstraction::*;
850 /// # fn main() -> Result<(), AutosarAbstractionError> {
851 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
852 /// let package = model.get_or_create_package("/some/package")?;
853 /// let interface = package.create_mode_switch_interface("ModeSwitchInterface")?;
854 /// assert!(model.get_element_by_path("/some/package/ModeSwitchInterface").is_some());
855 /// # Ok(())}
856 /// ```
857 ///
858 /// # Errors
859 ///
860 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the MODE-SWITCH-INTERFACE element
861 pub fn create_mode_switch_interface(&self, name: &str) -> Result<ModeSwitchInterface, AutosarAbstractionError> {
862 ModeSwitchInterface::new(name, self)
863 }
864
865 /// create a new `NvDataInterface` in the package
866 ///
867 /// # Example
868 ///
869 /// ```
870 /// # use autosar_data::*;
871 /// # use autosar_data_abstraction::*;
872 /// # fn main() -> Result<(), AutosarAbstractionError> {
873 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
874 /// let package = model.get_or_create_package("/some/package")?;
875 /// let interface = package.create_nv_data_interface("NvDataInterface")?;
876 /// assert!(model.get_element_by_path("/some/package/NvDataInterface").is_some());
877 /// # Ok(())}
878 /// ```
879 ///
880 /// # Errors
881 ///
882 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the NV-DATA-INTERFACE element
883 pub fn create_nv_data_interface(&self, name: &str) -> Result<NvDataInterface, AutosarAbstractionError> {
884 NvDataInterface::new(name, self)
885 }
886
887 /// create a new `ParameterInterface` in the package
888 ///
889 /// # Example
890 ///
891 /// ```
892 /// # use autosar_data::*;
893 /// # use autosar_data_abstraction::*;
894 /// # fn main() -> Result<(), AutosarAbstractionError> {
895 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
896 /// let package = model.get_or_create_package("/some/package")?;
897 /// let interface = package.create_parameter_interface("ParameterInterface")?;
898 /// assert!(model.get_element_by_path("/some/package/ParameterInterface").is_some());
899 /// # Ok(())}
900 /// ```
901 ///
902 /// # Errors
903 ///
904 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the PARAMETER-INTERFACE element
905 pub fn create_parameter_interface(&self, name: &str) -> Result<ParameterInterface, AutosarAbstractionError> {
906 ParameterInterface::new(name, self)
907 }
908
909 /// create a new `SenderReceiverInterface` in the package
910 ///
911 /// # Example
912 ///
913 /// ```
914 /// # use autosar_data::*;
915 /// # use autosar_data_abstraction::*;
916 /// # fn main() -> Result<(), AutosarAbstractionError> {
917 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
918 /// let package = model.get_or_create_package("/some/package")?;
919 /// let interface = package.create_sender_receiver_interface("SenderReceiverInterface")?;
920 /// assert!(model.get_element_by_path("/some/package/SenderReceiverInterface").is_some());
921 /// # Ok(())}
922 /// ```
923 ///
924 /// # Errors
925 ///
926 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the SENDER-RECEIVER-INTERFACE element
927 pub fn create_sender_receiver_interface(
928 &self,
929 name: &str,
930 ) -> Result<SenderReceiverInterface, AutosarAbstractionError> {
931 SenderReceiverInterface::new(name, self)
932 }
933
934 /// create a new `SensorActuatorSwComponentType` in the package
935 ///
936 /// # Example
937 ///
938 /// ```
939 /// # use autosar_data::*;
940 /// # use autosar_data_abstraction::{*, communication::*};
941 /// # fn main() -> Result<(), AutosarAbstractionError> {
942 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
943 /// let package = model.get_or_create_package("/some/package")?;
944 /// let component = package.create_sensor_actuator_sw_component_type("SensorActuatorSwComponentType")?;
945 /// assert!(model.get_element_by_path("/some/package/SensorActuatorSwComponentType").is_some());
946 /// # Ok(())}
947 /// ```
948 ///
949 /// # Errors
950 ///
951 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the SENSOR-ACTUATOR-SW-COMPONENT-TYPE element
952 pub fn create_sensor_actuator_sw_component_type(
953 &self,
954 name: &str,
955 ) -> Result<SensorActuatorSwComponentType, AutosarAbstractionError> {
956 SensorActuatorSwComponentType::new(name, self)
957 }
958
959 /// create a new `ServiceSwComponentType` in the package
960 ///
961 /// # Example
962 ///
963 /// ```
964 /// # use autosar_data::*;
965 /// # use autosar_data_abstraction::*;
966 /// # fn main() -> Result<(), AutosarAbstractionError> {
967 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
968 /// let package = model.get_or_create_package("/some/package")?;
969 /// let component = package.create_service_sw_component_type("ServiceSwComponentType")?;
970 /// assert!(model.get_element_by_path("/some/package/ServiceSwComponentType").is_some());
971 /// # Ok(())}
972 /// ```
973 ///
974 /// # Errors
975 ///
976 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the SERVICE-SW-COMPONENT-TYPE element
977 pub fn create_service_sw_component_type(
978 &self,
979 name: &str,
980 ) -> Result<ServiceSwComponentType, AutosarAbstractionError> {
981 ServiceSwComponentType::new(name, self)
982 }
983
984 /// create a new `SomeipSdClientEventGroupTimingConfig` in the package
985 ///
986 /// # Example
987 ///
988 /// ```
989 /// # use autosar_data::*;
990 /// # use autosar_data_abstraction::{*, communication::*};
991 /// # fn main() -> Result<(), AutosarAbstractionError> {
992 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
993 /// let package = model.get_or_create_package("/some/package")?;
994 /// let client_config = package.create_someip_sd_client_event_group_timing_config("SomeipSdClientEventGroupTimingConfig", 10)?;
995 /// assert!(model.get_element_by_path("/some/package/SomeipSdClientEventGroupTimingConfig").is_some());
996 /// # Ok(())}
997 /// ```
998 ///
999 /// # Errors
1000 ///
1001 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the SOMEIP-SD-CLIENT-EVENT-GROUP-TIMING-CONFIG element
1002 pub fn create_someip_sd_client_event_group_timing_config(
1003 &self,
1004 name: &str,
1005 time_to_live: u32,
1006 ) -> Result<SomeipSdClientEventGroupTimingConfig, AutosarAbstractionError> {
1007 SomeipSdClientEventGroupTimingConfig::new(name, self, time_to_live)
1008 }
1009
1010 /// create a new `SomeipSdClientServiceInstanceConfig` in the package
1011 ///
1012 /// # Example
1013 ///
1014 /// ```
1015 /// # use autosar_data::*;
1016 /// # use autosar_data_abstraction::*;
1017 /// # fn main() -> Result<(), AutosarAbstractionError> {
1018 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1019 /// let package = model.get_or_create_package("/some/package")?;
1020 /// let service_instance = package.create_someip_sd_client_service_instance_config("SomeipSdClientServiceInstanceConfig")?;
1021 /// assert!(model.get_element_by_path("/some/package/SomeipSdClientServiceInstanceConfig").is_some());
1022 /// # Ok(())}
1023 /// ```
1024 ///
1025 /// # Errors
1026 ///
1027 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the SOMEIP-SD-CLIENT-SERVICE-INSTANCE-CONFIG element
1028 pub fn create_someip_sd_client_service_instance_config(
1029 &self,
1030 name: &str,
1031 ) -> Result<SomeipSdClientServiceInstanceConfig, AutosarAbstractionError> {
1032 SomeipSdClientServiceInstanceConfig::new(name, self)
1033 }
1034
1035 /// create a new `SomeipSdServerEventGroupTimingConfig` in the package
1036 ///
1037 /// # Example
1038 ///
1039 /// ```
1040 /// # use autosar_data::*;
1041 /// # use autosar_data_abstraction::{*, communication::*};
1042 /// # fn main() -> Result<(), AutosarAbstractionError> {
1043 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1044 /// let package = model.get_or_create_package("/some/package")?;
1045 /// let request_response_delay = RequestResponseDelay {
1046 /// min_value: 0.1,
1047 /// max_value: 0.2,
1048 /// };
1049 /// let timing_config = package.create_someip_sd_server_event_group_timing_config("SomeipSdServerEventGroupTimingConfig", &request_response_delay)?;
1050 /// assert!(model.get_element_by_path("/some/package/SomeipSdServerEventGroupTimingConfig").is_some());
1051 /// # Ok(())}
1052 /// ```
1053 ///
1054 /// # Errors
1055 ///
1056 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the SOMEIP-SD-SERVER-EVENT-GROUP-TIMING-CONFIG element
1057 pub fn create_someip_sd_server_event_group_timing_config(
1058 &self,
1059 name: &str,
1060 request_response_delay: &RequestResponseDelay,
1061 ) -> Result<SomeipSdServerEventGroupTimingConfig, AutosarAbstractionError> {
1062 SomeipSdServerEventGroupTimingConfig::new(name, self, request_response_delay)
1063 }
1064
1065 /// create a new `SomeipSdServerServiceInstanceConfig` in the package
1066 ///
1067 /// # Example
1068 ///
1069 /// ```
1070 /// # use autosar_data::*;
1071 /// # use autosar_data_abstraction::*;
1072 /// # fn main() -> Result<(), AutosarAbstractionError> {
1073 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1074 /// let package = model.get_or_create_package("/some/package")?;
1075 /// let service_instance = package.create_someip_sd_server_service_instance_config("SomeipSdServerServiceInstanceConfig", 10)?;
1076 /// assert!(model.get_element_by_path("/some/package/SomeipSdServerServiceInstanceConfig").is_some());
1077 /// # Ok(())}
1078 /// ```
1079 ///
1080 /// # Errors
1081 ///
1082 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the SOMEIP-SD-SERVER-SERVICE-INSTANCE-CONFIG element
1083 pub fn create_someip_sd_server_service_instance_config(
1084 &self,
1085 name: &str,
1086 ttl: u32,
1087 ) -> Result<SomeipSdServerServiceInstanceConfig, AutosarAbstractionError> {
1088 SomeipSdServerServiceInstanceConfig::new(name, self, ttl)
1089 }
1090
1091 /// create a new `SwBaseType` in the package
1092 ///
1093 /// # Example
1094 ///
1095 /// ```
1096 /// # use autosar_data::*;
1097 /// # use autosar_data_abstraction::{*, datatype::*};
1098 /// # fn main() -> Result<(), AutosarAbstractionError> {
1099 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1100 /// let package = model.get_or_create_package("/some/package")?;
1101 /// let base_type = package.create_sw_base_type("MyBaseType", 8, BaseTypeEncoding::None, None, None, None)?;
1102 /// assert!(model.get_element_by_path("/some/package/MyBaseType").is_some());
1103 /// # Ok(())}
1104 /// ```
1105 ///
1106 /// # Errors
1107 ///
1108 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the SW-BASE-TYPE element
1109 pub fn create_sw_base_type(
1110 &self,
1111 name: &str,
1112 bit_length: u32,
1113 base_type_encoding: BaseTypeEncoding,
1114 byte_order: Option<ByteOrder>,
1115 mem_alignment: Option<u32>,
1116 native_declaration: Option<&str>,
1117 ) -> Result<SwBaseType, AutosarAbstractionError> {
1118 SwBaseType::new(
1119 name,
1120 self,
1121 bit_length,
1122 base_type_encoding,
1123 byte_order,
1124 mem_alignment,
1125 native_declaration,
1126 )
1127 }
1128
1129 /// create a new System in the package
1130 ///
1131 /// Note that an Autosar model should ony contain one SYSTEM. This is not checked here.
1132 ///
1133 /// # Example
1134 ///
1135 /// ```
1136 /// # use autosar_data::*;
1137 /// # use autosar_data_abstraction::*;
1138 /// # fn main() -> Result<(), AutosarAbstractionError> {
1139 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1140 /// let package = model.get_or_create_package("/some/package")?;
1141 /// let system = package.create_system("System", SystemCategory::SystemExtract)?;
1142 /// assert!(model.get_element_by_path("/some/package/System").is_some());
1143 /// # Ok(())}
1144 /// ```
1145 ///
1146 /// # Errors
1147 ///
1148 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the SYSTEM element
1149 pub fn create_system(&self, name: &str, category: SystemCategory) -> Result<System, AutosarAbstractionError> {
1150 System::new(name, self, category)
1151 }
1152
1153 /// create a new `SystemSignal` in the package
1154 ///
1155 /// # Example
1156 ///
1157 /// ```
1158 /// # use autosar_data::*;
1159 /// # use autosar_data_abstraction::*;
1160 /// # fn main() -> Result<(), AutosarAbstractionError> {
1161 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1162 /// let package = model.get_or_create_package("/some/package")?;
1163 /// let signal = package.create_system_signal("MySignal")?;
1164 /// assert!(model.get_element_by_path("/some/package/MySignal").is_some());
1165 /// # Ok(())}
1166 /// ```
1167 ///
1168 /// # Errors
1169 ///
1170 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the SYSTEM-SIGNAL element
1171 pub fn create_system_signal(&self, name: &str) -> Result<SystemSignal, AutosarAbstractionError> {
1172 SystemSignal::new(name, self)
1173 }
1174
1175 /// create a new `SystemSignalGroup` in the package
1176 ///
1177 /// # Example
1178 ///
1179 /// ```
1180 /// # use autosar_data::*;
1181 /// # use autosar_data_abstraction::*;
1182 /// # fn main() -> Result<(), AutosarAbstractionError> {
1183 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1184 /// let package = model.get_or_create_package("/some/package")?;
1185 /// let signal_group = package.create_system_signal_group("MySignalGroup")?;
1186 /// assert!(model.get_element_by_path("/some/package/MySignalGroup").is_some());
1187 /// # Ok(())}
1188 /// ```
1189 ///
1190 /// # Errors
1191 ///
1192 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the SYSTEM-SIGNAL-GROUP element
1193 pub fn create_system_signal_group(&self, name: &str) -> Result<SystemSignalGroup, AutosarAbstractionError> {
1194 SystemSignalGroup::new(name, self)
1195 }
1196
1197 /// create a new `TriggerInterface` in the package
1198 ///
1199 /// # Example
1200 ///
1201 /// ```
1202 /// # use autosar_data::*;
1203 /// # use autosar_data_abstraction::*;
1204 /// # fn main() -> Result<(), AutosarAbstractionError> {
1205 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1206 /// let package = model.get_or_create_package("/some/package")?;
1207 /// let interface = package.create_trigger_interface("TriggerInterface")?;
1208 /// assert!(model.get_element_by_path("/some/package/TriggerInterface").is_some());
1209 /// # Ok(())}
1210 /// ```
1211 ///
1212 /// # Errors
1213 ///
1214 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the TRIGGER-INTERFACE element
1215 pub fn create_trigger_interface(&self, name: &str) -> Result<TriggerInterface, AutosarAbstractionError> {
1216 TriggerInterface::new(name, self)
1217 }
1218
1219 /// create a new `Unit` in the package
1220 ///
1221 /// # Example
1222 ///
1223 /// ```
1224 /// # use autosar_data::*;
1225 /// # use autosar_data_abstraction::*;
1226 /// # fn main() -> Result<(), AutosarAbstractionError> {
1227 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1228 /// let package = model.get_or_create_package("/some/package")?;
1229 /// let unit = package.create_unit("Unit", Some("UnitDisplayName"))?;
1230 /// assert!(model.get_element_by_path("/some/package/Unit").is_some());
1231 /// # Ok(())}
1232 /// ```
1233 ///
1234 /// # Errors
1235 ///
1236 /// - [`AutosarAbstractionError::ModelError`] An error occurred in the Autosar model while trying to create the UNIT element
1237 pub fn create_unit(&self, name: &str, display_name: Option<&str>) -> Result<Unit, AutosarAbstractionError> {
1238 Unit::new(name, self, display_name)
1239 }
1240
1241 /// iterate over all elements in the package
1242 ///
1243 /// # Example
1244 ///
1245 /// ```
1246 /// # use autosar_data::*;
1247 /// # use autosar_data_abstraction::*;
1248 /// # fn main() -> Result<(), AutosarAbstractionError> {
1249 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1250 /// let package = model.get_or_create_package("/some/package")?;
1251 /// for element in package.elements() {
1252 /// println!("{:?}", element);
1253 /// }
1254 /// # Ok(())}
1255 /// ```
1256 pub fn elements(&self) -> impl Iterator<Item = Element> + Send + use<> {
1257 self.0
1258 .get_sub_element(ElementName::Elements)
1259 .into_iter()
1260 .flat_map(|element| element.sub_elements())
1261 }
1262
1263 /// create a new `ArPackage` as a sub-package of the package
1264 ///
1265 /// # Example
1266 ///
1267 /// ```
1268 /// # use autosar_data::*;
1269 /// # use autosar_data_abstraction::*;
1270 /// # fn main() -> Result<(), AutosarAbstractionError> {
1271 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1272 /// let package = model.get_or_create_package("/some/package")?;
1273 /// let sub_package = package.create_sub_package("SubPackage")?;
1274 /// assert!(model.get_element_by_path("/some/package/SubPackage").is_some());
1275 /// # Ok(())}
1276 /// ```
1277 pub fn create_sub_package(&self, name: &str) -> Result<ArPackage, AutosarAbstractionError> {
1278 let sub_package_elem = self
1279 .0
1280 .get_or_create_sub_element(ElementName::ArPackages)
1281 .and_then(|elem| elem.create_named_sub_element(ElementName::ArPackage, name))?;
1282 Ok(Self(sub_package_elem))
1283 }
1284
1285 /// iterate over all sub-packages in the package
1286 ///
1287 /// # Example
1288 ///
1289 /// ```
1290 /// # use autosar_data::*;
1291 /// # use autosar_data_abstraction::*;
1292 /// # fn main() -> Result<(), AutosarAbstractionError> {
1293 /// # let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1294 /// let package = model.get_or_create_package("/some/package")?;
1295 /// for sub_package in package.sub_packages() {
1296 /// println!("{:?}", sub_package);
1297 /// }
1298 /// # Ok(())}
1299 /// ```
1300 pub fn sub_packages(&self) -> impl Iterator<Item = ArPackage> + Send + use<> {
1301 self.0
1302 .get_sub_element(ElementName::ArPackages)
1303 .into_iter()
1304 .flat_map(|element| element.sub_elements())
1305 .filter_map(|element| ArPackage::try_from(element).ok())
1306 }
1307}
1308
1309//##################################################################
1310
1311#[cfg(test)]
1312mod test {
1313 use super::*;
1314 use crate::{AutosarModelAbstraction, datatype::*};
1315 use crate::{System, SystemCategory};
1316 use autosar_data::AutosarVersion;
1317
1318 #[test]
1319 fn package() {
1320 let model = AutosarModel::new();
1321 // can't do anything in an incomplete model: it has no files
1322 let result = ArPackage::get_or_create(&model, "/bad");
1323 assert!(result.is_err());
1324
1325 model.create_file("filename", AutosarVersion::Autosar_00048).unwrap();
1326
1327 // create a new package
1328 let result = ArPackage::get_or_create(&model, "/pkg1");
1329 assert!(result.is_ok());
1330 let package = result.unwrap();
1331 assert_eq!(package.name().unwrap(), "pkg1");
1332 // get the existing package
1333 let result = ArPackage::get_or_create(&model, "/pkg1");
1334 assert!(result.is_ok());
1335 // create multiple levels
1336 let result = ArPackage::get_or_create(&model, "/level1/level2/level3");
1337 assert!(result.is_ok());
1338 let package = result.unwrap();
1339 assert_eq!(package.name().unwrap(), "level3");
1340
1341 // can't create a package due to an element name conflict
1342 let pkg = ArPackage::get_or_create(&model, "/test").unwrap();
1343 System::new("system", &pkg, SystemCategory::EcuExtract).unwrap();
1344 let result = ArPackage::get_or_create(&model, "/test/system");
1345 assert!(result.is_err());
1346 let result = ArPackage::get_or_create(&model, "/test/system/sub");
1347 assert!(result.is_err());
1348
1349 // invalid path: does not start with '/'
1350 let result = ArPackage::get_or_create(&model, "hello world");
1351 assert!(result.is_err());
1352
1353 // conversions
1354 let element: Element = pkg.into();
1355 let result = ArPackage::try_from(element);
1356 assert!(result.is_ok());
1357 let result = ArPackage::try_from(model.root_element());
1358 assert!(result.is_err());
1359 }
1360
1361 #[test]
1362 fn create_package_items() {
1363 let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1364 let package = model.get_or_create_package("/some/package").unwrap();
1365
1366 // create a new application primitive data type
1367 let primitive_data_type = package
1368 .create_application_primitive_data_type(
1369 "ApplicationPrimitiveDataType",
1370 ApplicationPrimitiveCategory::Value,
1371 None,
1372 None,
1373 None,
1374 )
1375 .unwrap();
1376 assert_eq!(primitive_data_type.name().unwrap(), "ApplicationPrimitiveDataType");
1377
1378 // create a new application array data type
1379 let array_data_type = package
1380 .create_application_array_data_type(
1381 "ApplicationArrayDataType",
1382 &primitive_data_type,
1383 ApplicationArraySize::Fixed(4),
1384 )
1385 .unwrap();
1386 assert_eq!(array_data_type.name().unwrap(), "ApplicationArrayDataType");
1387
1388 // create a new application record data type
1389 let data_type = package
1390 .create_application_record_data_type("ApplicationRecordDataType")
1391 .unwrap();
1392 assert_eq!(data_type.name().unwrap(), "ApplicationRecordDataType");
1393
1394 // create a new application sw component type
1395 let component = package.create_application_sw_component_type("MyComponent").unwrap();
1396 assert_eq!(component.name().unwrap(), "MyComponent");
1397
1398 // create a new client server interface
1399 let interface = package.create_client_server_interface("ClientServerInterface").unwrap();
1400 assert_eq!(interface.name().unwrap(), "ClientServerInterface");
1401
1402 // create a new complex device driver sw component type
1403 let component = package
1404 .create_complex_device_driver_sw_component_type("ComplexDeviceDriverSwComponentType")
1405 .unwrap();
1406 assert_eq!(component.name().unwrap(), "ComplexDeviceDriverSwComponentType");
1407
1408 // create a new composition sw component type
1409 let component = package
1410 .create_composition_sw_component_type("CompositionSwComponentType")
1411 .unwrap();
1412 assert_eq!(component.name().unwrap(), "CompositionSwComponentType");
1413
1414 // create a new compu method
1415 let compu_content = CompuMethodContent::Linear(CompuMethodLinearContent {
1416 direction: CompuScaleDirection::IntToPhys,
1417 offset: 0.0,
1418 factor: 1.0,
1419 divisor: 1.0,
1420 lower_limit: None,
1421 upper_limit: None,
1422 });
1423 let compu_method = package.create_compu_method("CompuMethod", compu_content).unwrap();
1424 assert_eq!(compu_method.name().unwrap(), "CompuMethod");
1425
1426 // create a new data constr
1427 let data_constr = package.create_data_constr("DataConstr").unwrap();
1428 assert_eq!(data_constr.name().unwrap(), "DataConstr");
1429
1430 // create a new data transformation set
1431 let transformation_set = package.create_data_transformation_set("DataTransformationSet").unwrap();
1432 assert_eq!(transformation_set.name().unwrap(), "DataTransformationSet");
1433
1434 // create a new data type mapping set
1435 let mapping_set = package.create_data_type_mapping_set("DataTypeMappingSet").unwrap();
1436 assert_eq!(mapping_set.name().unwrap(), "DataTypeMappingSet");
1437
1438 // create a new ecu abstraction sw component type
1439 let component = package
1440 .create_ecu_abstraction_sw_component_type("EcuAbstractionSwComponentType")
1441 .unwrap();
1442 assert_eq!(component.name().unwrap(), "EcuAbstractionSwComponentType");
1443
1444 // create a new ecuc definition collection
1445 let ecuc_definition_collection = package
1446 .create_ecuc_definition_collection("EcucDefinitionCollection")
1447 .unwrap();
1448 assert_eq!(ecuc_definition_collection.name().unwrap(), "EcucDefinitionCollection");
1449
1450 // create a new ecuc value collection
1451 let ecuc_value_collection = package.create_ecuc_value_collection("EcucValueCollection").unwrap();
1452 assert_eq!(ecuc_value_collection.name().unwrap(), "EcucValueCollection");
1453
1454 // create a new ecuc destination uri def set
1455 let uri_def_set = package
1456 .create_ecuc_destination_uri_def_set("EcucDestinationUriDefSet")
1457 .unwrap();
1458 assert_eq!(uri_def_set.name().unwrap(), "EcucDestinationUriDefSet");
1459
1460 // create a new ecuc module def
1461 let ecuc_module_def = package.create_ecuc_module_def("EcucModuleDef").unwrap();
1462 assert_eq!(ecuc_module_def.name().unwrap(), "EcucModuleDef");
1463
1464 // create a new ecuc module configuration values
1465 let ecuc_module_configuration_values = package
1466 .create_ecuc_module_configuration_values("EcucModuleConfigurationValues", &ecuc_module_def)
1467 .unwrap();
1468 assert_eq!(
1469 ecuc_module_configuration_values.name().unwrap(),
1470 "EcucModuleConfigurationValues"
1471 );
1472
1473 // create a new implementation data type
1474 let sw_base_type = package
1475 .create_sw_base_type("uint8", 8, BaseTypeEncoding::None, None, None, None)
1476 .unwrap();
1477 let settings = ImplementationDataTypeSettings::Value {
1478 name: "ImplementationDataType_Value".to_string(),
1479 base_type: sw_base_type,
1480 compu_method: None,
1481 data_constraint: None,
1482 };
1483 let data_type = package.create_implementation_data_type(&settings).unwrap();
1484 assert_eq!(data_type.name().unwrap(), "ImplementationDataType_Value");
1485
1486 // create a new mode switch interface
1487 let interface = package.create_mode_switch_interface("ModeSwitchInterface").unwrap();
1488 assert_eq!(interface.name().unwrap(), "ModeSwitchInterface");
1489
1490 // create a new nv data interface
1491 let interface = package.create_nv_data_interface("NvDataInterface").unwrap();
1492 assert_eq!(interface.name().unwrap(), "NvDataInterface");
1493
1494 // create a new parameter interface
1495 let interface = package.create_parameter_interface("ParameterInterface").unwrap();
1496 assert_eq!(interface.name().unwrap(), "ParameterInterface");
1497
1498 // create a new sender receiver interface
1499 let interface = package
1500 .create_sender_receiver_interface("SenderReceiverInterface")
1501 .unwrap();
1502 assert_eq!(interface.name().unwrap(), "SenderReceiverInterface");
1503
1504 // create a new sensor actuator sw component type
1505 let component = package
1506 .create_sensor_actuator_sw_component_type("SensorActuatorSwComponentType")
1507 .unwrap();
1508 assert_eq!(component.name().unwrap(), "SensorActuatorSwComponentType");
1509
1510 // create a new service sw component type
1511 let component = package
1512 .create_service_sw_component_type("ServiceSwComponentType")
1513 .unwrap();
1514 assert_eq!(component.name().unwrap(), "ServiceSwComponentType");
1515
1516 // create a new someip sd client event group timing config
1517 let client_config = package
1518 .create_someip_sd_client_event_group_timing_config("SomeipSdClientEventGroupTimingConfig", 10)
1519 .unwrap();
1520 assert_eq!(client_config.name().unwrap(), "SomeipSdClientEventGroupTimingConfig");
1521
1522 // create a new someip sd client service instance config
1523 let service_instance = package
1524 .create_someip_sd_client_service_instance_config("SomeipSdClientServiceInstanceConfig")
1525 .unwrap();
1526 assert_eq!(service_instance.name().unwrap(), "SomeipSdClientServiceInstanceConfig");
1527
1528 // create a new someip sd server event group timing config
1529 let request_response_delay = RequestResponseDelay {
1530 min_value: 0.1,
1531 max_value: 0.2,
1532 };
1533 let timing_config = package
1534 .create_someip_sd_server_event_group_timing_config(
1535 "SomeipSdServerEventGroupTimingConfig",
1536 &request_response_delay,
1537 )
1538 .unwrap();
1539 assert_eq!(timing_config.name().unwrap(), "SomeipSdServerEventGroupTimingConfig");
1540
1541 // create a new someip sd server service instance config
1542 let service_instance = package
1543 .create_someip_sd_server_service_instance_config("SomeipSdServerServiceInstanceConfig", 10)
1544 .unwrap();
1545 assert_eq!(service_instance.name().unwrap(), "SomeipSdServerServiceInstanceConfig");
1546
1547 // create a new sw base type
1548 let sw_base_type = package
1549 .create_sw_base_type("SwBaseType", 8, BaseTypeEncoding::None, None, None, None)
1550 .unwrap();
1551 assert_eq!(sw_base_type.name().unwrap(), "SwBaseType");
1552
1553 // create a new system
1554 let system = package.create_system("System", SystemCategory::SystemExtract).unwrap();
1555 assert_eq!(system.name().unwrap(), "System");
1556
1557 // create a new system signal
1558 let signal = package.create_system_signal("SystemSignal").unwrap();
1559 assert_eq!(signal.name().unwrap(), "SystemSignal");
1560
1561 // create a new system signal group
1562 let signal_group = package.create_system_signal_group("SystemSignalGroup").unwrap();
1563 assert_eq!(signal_group.name().unwrap(), "SystemSignalGroup");
1564
1565 // create a new trigger interface
1566 let interface = package.create_trigger_interface("TriggerInterface").unwrap();
1567 assert_eq!(interface.name().unwrap(), "TriggerInterface");
1568
1569 // create a new unit
1570 let unit = package.create_unit("Unit", Some("UnitDisplayName")).unwrap();
1571 assert_eq!(unit.name().unwrap(), "Unit");
1572 }
1573
1574 #[test]
1575 fn test_elements_iter() {
1576 let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1577 let package = model.get_or_create_package("/some/package").unwrap();
1578
1579 package
1580 .create_application_record_data_type("ApplicationRecordDataType")
1581 .unwrap();
1582 package
1583 .create_application_sw_component_type("ApplicationSwComponentType")
1584 .unwrap();
1585 package.create_client_server_interface("ClientServerInterface").unwrap();
1586 package
1587 .create_complex_device_driver_sw_component_type("ComplexDeviceDriverSwComponentType")
1588 .unwrap();
1589 package
1590 .create_composition_sw_component_type("CompositionSwComponentType")
1591 .unwrap();
1592 package
1593 .create_compu_method(
1594 "CompuMethod",
1595 CompuMethodContent::Linear(CompuMethodLinearContent {
1596 direction: CompuScaleDirection::IntToPhys,
1597 offset: 0.0,
1598 factor: 1.0,
1599 divisor: 1.0,
1600 lower_limit: None,
1601 upper_limit: None,
1602 }),
1603 )
1604 .unwrap();
1605 package.create_data_constr("DataConstr").unwrap();
1606 package.create_data_transformation_set("DataTransformationSet").unwrap();
1607 package.create_data_type_mapping_set("DataTypeMappingSet").unwrap();
1608 package
1609 .create_ecu_abstraction_sw_component_type("EcuAbstractionSwComponentType")
1610 .unwrap();
1611 let sw_base_type = package
1612 .create_sw_base_type("uint8", 8, BaseTypeEncoding::None, None, None, None)
1613 .unwrap();
1614 let settings = ImplementationDataTypeSettings::Value {
1615 name: "ImplementationDataType_Value".to_string(),
1616 base_type: sw_base_type,
1617 compu_method: None,
1618 data_constraint: None,
1619 };
1620 package.create_implementation_data_type(&settings).unwrap();
1621 package.create_mode_switch_interface("ModeSwitchInterface").unwrap();
1622 package.create_nv_data_interface("NvDataInterface").unwrap();
1623 package.create_parameter_interface("ParameterInterface").unwrap();
1624 package
1625 .create_sender_receiver_interface("SenderReceiverInterface")
1626 .unwrap();
1627 package
1628 .create_sensor_actuator_sw_component_type("SensorActuatorSwComponentType")
1629 .unwrap();
1630 package
1631 .create_service_sw_component_type("ServiceSwComponentType")
1632 .unwrap();
1633 package
1634 .create_someip_sd_client_event_group_timing_config("SomeipSdClientEventGroupTimingConfig", 10)
1635 .unwrap();
1636 package
1637 .create_someip_sd_client_service_instance_config("SomeipSdClientServiceInstanceConfig")
1638 .unwrap();
1639 let request_response_delay = RequestResponseDelay {
1640 min_value: 0.1,
1641 max_value: 0.2,
1642 };
1643 package
1644 .create_someip_sd_server_event_group_timing_config(
1645 "SomeipSdServerEventGroupTimingConfig",
1646 &request_response_delay,
1647 )
1648 .unwrap();
1649 package
1650 .create_someip_sd_server_service_instance_config("SomeipSdServerServiceInstanceConfig", 10)
1651 .unwrap();
1652 // package
1653 // .create_sw_base_type("SwBaseType", 8, BaseTypeEncoding::None, None, None, None)
1654 // .unwrap();
1655 package.create_system("System", SystemCategory::SystemExtract).unwrap();
1656 package.create_system_signal("SystemSignal").unwrap();
1657 package.create_system_signal_group("SystemSignalGroup").unwrap();
1658 package.create_trigger_interface("TriggerInterface").unwrap();
1659 package.create_unit("Unit", Some("UnitDisplayName")).unwrap();
1660
1661 let mut elements = package.elements();
1662 let item = elements.next().unwrap();
1663 assert_eq!(item.element_name(), ElementName::ApplicationRecordDataType);
1664
1665 let item = elements.next().unwrap();
1666 assert_eq!(item.element_name(), ElementName::ApplicationSwComponentType);
1667
1668 let item = elements.next().unwrap();
1669 assert_eq!(item.element_name(), ElementName::ClientServerInterface);
1670
1671 let item = elements.next().unwrap();
1672 assert_eq!(item.element_name(), ElementName::ComplexDeviceDriverSwComponentType);
1673
1674 let item = elements.next().unwrap();
1675 assert_eq!(item.element_name(), ElementName::CompositionSwComponentType);
1676
1677 let item = elements.next().unwrap();
1678 assert_eq!(item.element_name(), ElementName::CompuMethod);
1679
1680 let item = elements.next().unwrap();
1681 assert_eq!(item.element_name(), ElementName::DataConstr);
1682
1683 let item = elements.next().unwrap();
1684 assert_eq!(item.element_name(), ElementName::DataTransformationSet);
1685
1686 let item = elements.next().unwrap();
1687 assert_eq!(item.element_name(), ElementName::DataTypeMappingSet);
1688
1689 let item = elements.next().unwrap();
1690 assert_eq!(item.element_name(), ElementName::EcuAbstractionSwComponentType);
1691
1692 let item = elements.next().unwrap();
1693 assert_eq!(item.element_name(), ElementName::SwBaseType);
1694
1695 let item = elements.next().unwrap();
1696 assert_eq!(item.element_name(), ElementName::ImplementationDataType);
1697
1698 let item = elements.next().unwrap();
1699 assert_eq!(item.element_name(), ElementName::ModeSwitchInterface);
1700
1701 let item = elements.next().unwrap();
1702 assert_eq!(item.element_name(), ElementName::NvDataInterface);
1703
1704 let item = elements.next().unwrap();
1705 assert_eq!(item.element_name(), ElementName::ParameterInterface);
1706
1707 let item = elements.next().unwrap();
1708 assert_eq!(item.element_name(), ElementName::SenderReceiverInterface);
1709
1710 let item = elements.next().unwrap();
1711 assert_eq!(item.element_name(), ElementName::SensorActuatorSwComponentType);
1712
1713 let item = elements.next().unwrap();
1714 assert_eq!(item.element_name(), ElementName::ServiceSwComponentType);
1715
1716 let item = elements.next().unwrap();
1717 assert_eq!(item.element_name(), ElementName::SomeipSdClientEventGroupTimingConfig);
1718
1719 let item = elements.next().unwrap();
1720 assert_eq!(item.element_name(), ElementName::SomeipSdClientServiceInstanceConfig);
1721
1722 let item = elements.next().unwrap();
1723 assert_eq!(item.element_name(), ElementName::SomeipSdServerEventGroupTimingConfig);
1724
1725 let item = elements.next().unwrap();
1726 assert_eq!(item.element_name(), ElementName::SomeipSdServerServiceInstanceConfig);
1727
1728 let item = elements.next().unwrap();
1729 assert_eq!(item.element_name(), ElementName::System);
1730
1731 let item = elements.next().unwrap();
1732 assert_eq!(item.element_name(), ElementName::SystemSignal);
1733
1734 let item = elements.next().unwrap();
1735 assert_eq!(item.element_name(), ElementName::SystemSignalGroup);
1736
1737 let item = elements.next().unwrap();
1738 assert_eq!(item.element_name(), ElementName::TriggerInterface);
1739
1740 let item = elements.next().unwrap();
1741 assert_eq!(item.element_name(), ElementName::Unit);
1742 }
1743
1744 #[test]
1745 fn sub_packages() {
1746 let model = AutosarModelAbstraction::create("filename", AutosarVersion::Autosar_00048);
1747 let package = model.get_or_create_package("/package").unwrap();
1748
1749 // create sub-packages
1750 package.create_sub_package("sub1").unwrap();
1751 package.create_sub_package("sub2").unwrap();
1752
1753 // name conflict: can't create a sub-package with the same name
1754 let result = package.create_sub_package("sub2");
1755 assert!(result.is_err());
1756
1757 // iterate over sub-packages
1758 assert_eq!(package.sub_packages().count(), 2);
1759 }
1760}