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
use crate::is_group_of::model::{
    GEDEntityLocation, GEDEntityOrientation, GEDRecord1, GEDRecord2, GEDRecord3, GEDRecord4,
    GEDRecord5, GEDRecord6, GEDRecord7, GEDRecord8, GEDRecord9, GroupEntityDescription,
    GroupReferencePoint, IsGroupOf,
};
use crate::{Serialize, SerializePdu, SupportedVersion};
use bytes::{BufMut, BytesMut};

impl SerializePdu for IsGroupOf {
    fn serialize_pdu(&self, _version: SupportedVersion, buf: &mut BytesMut) -> u16 {
        let group_id_bytes = self.group_id.serialize(buf);
        buf.put_u8(self.grouped_entity_category.into());
        buf.put_u8(self.descriptions.len() as u8);
        buf.put_u32(0u32);
        let ref_point_bytes = self.group_reference_point.serialize(buf);
        let descriptions_bytes = self
            .descriptions
            .iter()
            .map(|ged_record| ged_record.serialize(buf))
            .sum::<u16>();

        group_id_bytes + ref_point_bytes + descriptions_bytes + 6
    }
}

impl Serialize for GroupReferencePoint {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        buf.put_f64(self.latitude);
        buf.put_f64(self.longitude);

        16
    }
}

impl Serialize for GroupEntityDescription {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        match self {
            GroupEntityDescription::Undefined => 0,
            GroupEntityDescription::BasicGroundCombatVehicle(ged_record) => {
                ged_record.serialize(buf)
            }
            GroupEntityDescription::EnhancedGroundCombatVehicle(ged_record) => {
                ged_record.serialize(buf)
            }
            GroupEntityDescription::BasicGroundCombatSoldier(ged_record) => {
                ged_record.serialize(buf)
            }
            GroupEntityDescription::EnhancedGroundCombatSoldier(ged_record) => {
                ged_record.serialize(buf)
            }
            GroupEntityDescription::BasicRotorWingAircraft(ged_record) => ged_record.serialize(buf),
            GroupEntityDescription::EnhancedRotorWingAircraft(ged_record) => {
                ged_record.serialize(buf)
            }
            GroupEntityDescription::BasicFixedWingAircraft(ged_record) => ged_record.serialize(buf),
            GroupEntityDescription::EnhancedFixedWingAircraft(ged_record) => {
                ged_record.serialize(buf)
            }
            GroupEntityDescription::GroundLogisticsVehicle(ged_record) => ged_record.serialize(buf),
        }
    }
}

impl Serialize for GEDEntityLocation {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        buf.put_u16(self.x_offset);
        buf.put_u16(self.y_offset);
        buf.put_u16(self.z_offset);

        self.record_length()
    }
}

impl Serialize for GEDEntityOrientation {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        buf.put_u8(self.psi);
        buf.put_u8(self.theta);
        buf.put_u8(self.phi);

        self.record_length()
    }
}

impl Serialize for GEDRecord1 {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        buf.put_u16(self.entity_id);
        self.location.serialize(buf);
        self.appearance.serialize(buf);
        self.orientation.serialize(buf);
        buf.put_u8(self.speed);
        buf.put_u8(self.turret_azimuth);
        buf.put_u8(self.gun_elevation);
        buf.put_u8(self.turret_slew_rate);
        buf.put_u8(self.gun_elevation_rate);

        self.record_length()
    }
}

impl Serialize for GEDRecord2 {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        self.basic_ground_combat_vehicle.serialize(buf);
        buf.put_u8(self.fuel_status);
        buf.put_u8(self.ground_maintenance_status);
        buf.put_u8(self.primary_ammunition);
        buf.put_u8(self.secondary_ammunition);

        self.record_length()
    }
}

impl Serialize for GEDRecord3 {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        buf.put_u16(self.entity_id);
        self.location.serialize(buf);
        self.appearance.serialize(buf);
        self.orientation.serialize(buf);
        buf.put_u8(self.speed);
        buf.put_u8(self.head_azimuth);
        buf.put_u8(self.head_elevation);
        buf.put_u8(self.head_scan_rate);
        buf.put_u8(self.head_elevation_rate);

        self.record_length()
    }
}

impl Serialize for GEDRecord4 {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        self.basic_ground_combat_soldier.serialize(buf);
        buf.put_u8(self.water_status);
        buf.put_u8(self.reset_status);
        buf.put_u8(self.primary_ammunition);
        buf.put_u8(self.secondary_ammunition);

        self.record_length()
    }
}

impl Serialize for GEDRecord5 {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        buf.put_u16(self.entity_id);
        self.location.serialize(buf);
        self.appearance.serialize(buf);
        self.orientation.serialize(buf);
        buf.put_u8(self.fuel_status);
        buf.put_u8(self.movement_horizontal_deviation);
        buf.put_u8(self.movement_vertical_deviation);
        buf.put_u16(self.movement_speed);
        buf.put_u8(self.turret_azimuth);
        buf.put_u8(self.gun_elevation);
        buf.put_u8(self.turret_scan_rate);
        buf.put_u8(self.gun_elevation_rate);

        self.record_length()
    }
}

impl Serialize for GEDRecord6 {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        self.basic_rotor_wing_aircraft.serialize(buf);
        buf.put_u8(self.supplemental_fuel_status);
        buf.put_u8(self.air_maintenance_status);
        buf.put_u8(self.primary_ammunition);
        buf.put_u8(self.secondary_ammunition);

        self.record_length()
    }
}

impl Serialize for GEDRecord7 {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        buf.put_u16(self.entity_id);
        self.location.serialize(buf);
        self.appearance.serialize(buf);
        self.orientation.serialize(buf);
        buf.put_u8(self.fuel_status);
        buf.put_u8(self.movement_horizontal_deviation);
        buf.put_u8(self.movement_vertical_deviation);
        buf.put_u16(self.movement_speed);

        self.record_length()
    }
}

impl Serialize for GEDRecord8 {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        self.basic_fixed_wing_aircraft.serialize(buf);
        buf.put_u8(self.supplemental_fuel_status);
        buf.put_u8(self.air_maintenance_status);
        buf.put_u8(self.primary_ammunition);
        buf.put_u8(self.secondary_ammunition);

        self.record_length()
    }
}

impl Serialize for GEDRecord9 {
    fn serialize(&self, buf: &mut BytesMut) -> u16 {
        buf.put_u16(self.entity_id);
        self.location.serialize(buf);
        self.appearance.serialize(buf);
        self.orientation.serialize(buf);
        buf.put_u16(self.speed);

        self.record_length()
    }
}