1pub mod model;
2pub(crate) mod parser;
3
4pub mod acknowledge;
5pub mod acknowledge_r;
6pub mod action_request;
7pub mod action_request_r;
8pub mod action_response;
9pub mod action_response_r;
10pub mod aggregate_state;
11pub mod attribute;
12pub mod collision;
13pub mod collision_elastic;
14pub mod comment;
15pub mod comment_r;
16pub mod create_entity;
17pub mod create_entity_r;
18pub mod data;
19pub mod data_query;
20pub mod data_query_r;
21pub mod data_r;
22pub mod designator;
23pub mod detonation;
24pub mod electromagnetic_emission;
25pub mod entity_state;
26pub mod entity_state_update;
27pub mod event_report;
28pub mod event_report_r;
29pub mod fire;
30pub mod iff;
31pub mod is_group_of;
32pub mod is_part_of;
33pub mod other;
34pub mod receiver;
35pub mod record_query_r;
36pub mod record_r;
37pub mod remove_entity;
38pub mod remove_entity_r;
39pub mod repair_complete;
40pub mod repair_response;
41pub mod resupply_cancel;
42pub mod resupply_offer;
43pub mod resupply_received;
44pub mod sees;
45pub mod service_request;
46pub mod set_data;
47pub mod set_data_r;
48pub mod set_record_r;
49pub mod signal;
50pub mod start_resume;
51pub mod start_resume_r;
52pub mod stop_freeze;
53pub mod stop_freeze_r;
54pub mod transfer_ownership;
55pub mod transmitter;
56pub mod underwater_acoustic;
57
58pub mod errors;
59mod writer;
60
61use crate::common::errors::DisError;
62use crate::common::model::Pdu;
63use crate::common::parser::parse_multiple_pdu;
64use crate::enumerations::{PduType, ProtocolVersion};
65use bytes::BytesMut;
66
67#[allow(dead_code)]
68pub enum SupportedVersion {
69 V6,
70 V7,
71 Unsupported,
72}
73
74impl From<ProtocolVersion> for SupportedVersion {
75 fn from(version: ProtocolVersion) -> Self {
76 match version {
77 ProtocolVersion::IEEE1278_1A1998 => SupportedVersion::V6,
78 ProtocolVersion::IEEE1278_12012 => SupportedVersion::V7,
79 _ => SupportedVersion::Unsupported,
80 }
81 }
82}
83
84#[must_use]
86pub fn supported_protocol_versions() -> Vec<ProtocolVersion> {
87 vec![
88 ProtocolVersion::IEEE1278_1A1998,
89 ProtocolVersion::IEEE1278_12012,
90 ]
91}
92
93pub trait BodyInfo {
95 fn body_length(&self) -> u16;
96 fn body_type(&self) -> PduType;
97}
98
99pub trait Interaction {
103 fn originator(&self) -> Option<&model::EntityId>;
104 fn receiver(&self) -> Option<&model::EntityId>;
105}
106
107pub trait SerializePdu {
111 fn serialize_pdu(&self, version: SupportedVersion, buf: &mut BytesMut) -> u16;
112}
113
114pub trait Serialize {
118 fn serialize(&self, buf: &mut BytesMut) -> u16;
119}
120
121pub fn parse(input: &[u8]) -> Result<Vec<Pdu>, DisError> {
130 parse_multiple_pdu(input)
131}
132
133pub fn parse_v6(input: &[u8]) -> Result<Vec<Pdu>, DisError> {
142 let pdus = parse_multiple_pdu(input)?
143 .into_iter()
144 .filter(|pdu| pdu.header.protocol_version == ProtocolVersion::IEEE1278_1A1998)
145 .collect();
146 Ok(pdus)
147}
148
149pub fn parse_v7(input: &[u8]) -> Result<Vec<Pdu>, DisError> {
158 let pdus = parse_multiple_pdu(input)?
159 .into_iter()
160 .filter(|pdu| pdu.header.protocol_version == ProtocolVersion::IEEE1278_12012)
161 .collect();
162 Ok(pdus)
163}