dis-rs 0.13.0

An implementation of the Distributed Interactive Simulation protocol (IEEE-1278.1) in Rust. This main crate contains PDU implementations and facilities to read/write PDUs from Rust data structures to the wire format and vice versa. It supports versions 6 and 7 of the protocol.
Documentation
pub mod builder;
pub mod model;
pub mod parser;
pub mod writer;

#[cfg(test)]
mod tests {
    use crate::common::model::DisTimeStamp;
    use crate::common::model::{Pdu, PduHeader};
    use crate::common::parser::parse_pdu;
    use crate::entity_state::model::EntityAppearance;
    use crate::enumerations::{AirPlatformAppearance, IsGroupOfGroupedEntityCategory, PduType};
    use crate::is_group_of::model::{
        GEDEntityLocation, GEDEntityOrientation, GEDRecord7, GEDRecord8, GroupEntityDescription,
        GroupReferencePoint, IsGroupOf,
    };
    use crate::model::EntityId;
    use crate::BodyRaw;
    use bytes::BytesMut;

    #[test]
    fn is_group_of_internal_consistency() {
        let header = PduHeader::new_v6(1, PduType::IsGroupOf);

        let body = IsGroupOf::builder()
            .with_group_id(EntityId::new(1, 10, 20))
            .with_group_reference_point(
                GroupReferencePoint::default()
                    .with_latitude(1.0)
                    .with_longitude(1.0),
            )
            .with_grouped_entity_category(IsGroupOfGroupedEntityCategory::EnhancedFixedWingAircraft)
            .with_description(GroupEntityDescription::EnhancedFixedWingAircraft(
                GEDRecord8 {
                    basic_fixed_wing_aircraft: GEDRecord7 {
                        entity_id: 30,
                        location: GEDEntityLocation::default(),
                        appearance: EntityAppearance::AirPlatform(AirPlatformAppearance::default()),
                        orientation: GEDEntityOrientation::default(),
                        fuel_status: 0,
                        movement_horizontal_deviation: 0,
                        movement_vertical_deviation: 0,
                        movement_speed: 0,
                    },
                    supplemental_fuel_status: 1,
                    air_maintenance_status: 2,
                    primary_ammunition: 3,
                    secondary_ammunition: 4,
                },
            ))
            .build()
            .into_pdu_body();
        let original_pdu =
            Pdu::finalize_from_parts(header, body, DisTimeStamp::new_absolute_from_secs(100));
        let pdu_length = original_pdu.header.pdu_length;
        let original_length = original_pdu.pdu_length();

        let mut buf = BytesMut::with_capacity(pdu_length as usize);

        let serialized_length = original_pdu.serialize(&mut buf).unwrap();

        assert_eq!(original_length, serialized_length);

        let parsed = parse_pdu(&buf);
        match parsed {
            Ok(ref pdu) => {
                assert_eq!(&original_pdu, pdu);
            }
            Err(ref err) => {
                panic!("Parse error: {err}");
            }
        }
    }
}