cottak 0.1.0

A built in test application for Linux using dynamic libraries in Rust
Documentation
//
// Copyright (c) 2025, Astute Systems PTY LTD
//
// This file is part of the VivoeX SDK project developed by Astute Systems.
//
// See the commercial LICENSE file in the project root for full license details.
//
//! Create a casevac XML/protobuf object.
//!
//! ``` xml
//! <?xml version="1.0" encoding="utf-16" standalone="yes"?>
//! <event version="2.0" uid="02fad1aa-fe54-44bf-98e0-5f84f051e46c" type="b-r-f-h-c" time="2025-02-16T02:44:27.82Z" start="2025-02-16T02:44:27.82Z" stale="2025-02-17T02:44:27.82Z" how="h-g-i-g-o">
//!     <point lat="-27.5316104" lon="152.9842845" hae="9999999" ce="9999999" le="9999999" />
//!     <detail>
//!         <link type="a-f-G-U-C-I" uid="S-1-12-1-2335450818-1167661710-439542947-1473530812" parent_callsign="HELLION" relation="p-p" production_time="2025-02-16T02:42:53Z" />
//!         <archive />
//!         <status readiness="false" />
//!         <remarks>Operational </remarks>
//!         <_medevac_ title="MED.16.024253" casevac="false" freq="0.0" urgent="5" priority="2" routine="15" extraction_equipment="true" security="0" hlz_marking="3" us_military="30" us_civilian="6" nonus_military="1" nonus_civilian="0" epw="2" child="0" terrain_none="true" obstacles="None" medline_remarks="Operational " zone_prot_selection="0" zone_protected_coord="56J MQ 98448 54681" zone_prot_marker="-27.5316104,152.9842845,NaN,NaN,NaN,???" />
//!         <contact callsign="HELLION" />
//!     </detail>
//! </event>
//! ```

use crate::cot_base::{CursorOnTarget, Sendable};
use crate::time::Time;

/// Casevac object
/// * `cot` - CursorOnTarget
/// * `callsign` - Callsign
/// * `contact` - Contact
/// * `message` - Message
/// * `remarks` - Remarks
///
#[derive(Clone)]
pub struct Casevac {
    pub cot: CursorOnTarget,
    callsign: String,
    contact: String,
    message: String,
    remarks: Option<String>,
    parent_callsign: String,
    production_time: String,
    readiness: bool,
    med_title: String,
    casevac: bool,
    freq: f64,
    urgency: u8,
    priority: u8,
    routine: u8,
    extraction_equipment: bool,
    security: u8,
    markings: u8,
    us_military: u8,
    us_civilian: u8,
    nonus_military: u8,
    nonus_civilian: u8,
    epw: u8,
    child: u8,
    terrain_none: bool,
    obstacles: String,
    medline_remarks: String,
    zone_prot_selection: u8,
    zone_protected_coord: String,
    zone_prot_marker: String,
    contact_callsign: String,
}

impl Casevac {
    pub fn new(
        cot: CursorOnTarget,
        callsign: String,
        contact: String,
        message: String,
        remarks: Option<String>,
        parent_callsign: String,
        production_time: String,
        readiness: bool,
        med_title: String,
        casevac: bool,
        freq: f64,
        urgency: u8,
        priority: u8,
        routine: u8,
        extraction_equipment: bool,
        security: u8,
        markings: u8,
        us_military: u8,
        us_civilian: u8,
        nonus_military: u8,
        nonus_civilian: u8,
        epw: u8,
        child: u8,
        terrain_none: bool,
        obstacles: String,
        medline_remarks: String,
        zone_prot_selection: u8,
        zone_protected_coord: String,
        zone_prot_marker: String,
        contact_callsign: String,
    ) -> Casevac {
        let mut new_casevac = Casevac {
            cot,
            callsign,
            contact,
            message,
            remarks,
            parent_callsign,
            production_time,
            readiness,
            med_title,
            casevac,
            freq,
            urgency,
            priority,
            routine,
            extraction_equipment,
            security,
            markings,
            us_military,
            us_civilian,
            nonus_military,
            nonus_civilian,
            epw,
            child,
            terrain_none,
            obstacles,
            medline_remarks,
            zone_prot_selection,
            zone_protected_coord,
            zone_prot_marker,
            contact_callsign,
        };

        new_casevac.cot.type_string = Some("b-r-f-h-c".to_string());
        new_casevac.cot.how_string = "h-g-i-g-o".to_string();
        new_casevac.update_xml();
        new_casevac
    }
}
impl Sendable for Casevac {
    fn update_xml(&mut self) {
        let remark = match self.remarks {
            Some(ref r) => r.clone(),
            None => "".to_string(),
        };

        let details = format! {r#"         <link type="a-f-G-U-C-I" uid="{uid}" parent_callsign="{parent_callsign}" relation="p-p" production_time="{production_time}" />
         <archive />
         <status readiness="{readiness}" />
         <remarks>{remarks}</remarks>
         <_medevac_ title="{med_title}" casevac="{casevac}" freq="{freq}" urgent="{urgency}" priority="{priority}" routine="{routine}" extraction_equipment="{extraction_equipment}" security="{security}" hlz_marking="{markings}" us_military="{us_military}" us_civilian="{us_civilian}" nonus_military="{nonus_military}" nonus_civilian="{nonus_civilian}" epw="{epw}" child="{child}" terrain_none="{terrain_none}" obstacles="{obstacles}" medline_remarks="{medline_remarks}" zone_prot_selection="{zone_prot_selection}" zone_protected_coord="{zone_protected_coord}" zone_prot_marker="{zone_prot_marker}" />
         <contact callsign="{contact_callsign}" />"#,
            uid = self.cot.uid,
            parent_callsign = self.contact,
            production_time = Time::time_to_string(Time::now()),
            readiness = self.readiness,
            remarks = remark,
            med_title = self.med_title,
            casevac = self.casevac,
            freq = self.freq,
            urgency = self.urgency,
            priority = self.priority,
            routine = self.routine,
            extraction_equipment = self.extraction_equipment,
            security = self.security,
            markings = self.markings,
            us_military = self.us_military,
            us_civilian = self.us_civilian,
            nonus_military = self.nonus_military,
            nonus_civilian = self.nonus_civilian,
            epw = self.epw,
            child = self.child,
            terrain_none = self.terrain_none,
            obstacles = self.obstacles,
            medline_remarks = self.medline_remarks,
            zone_prot_selection = self.zone_prot_selection,
            zone_protected_coord = self.zone_protected_coord,
            zone_prot_marker = self.zone_prot_marker,
            contact_callsign = self.contact_callsign,
        };
        self.cot.set_xml_detail(details);
    }
    fn modify_field(&mut self, field: &str, value: &str) {
        match field {
            "callsign" => self.callsign = value.to_string(),
            "contact" => self.contact = value.to_string(),
            "message" => self.message = value.to_string(),
            "remarks" => self.remarks = Some(value.to_string()),
            "parent_callsign" => self.parent_callsign = value.to_string(),
            "production_time" => self.production_time = value.to_string(),
            "readiness" => self.readiness = value.parse().unwrap(),
            "med_title" => self.med_title = value.to_string(),
            "casevac" => self.casevac = value.parse().unwrap(),
            "freq" => self.freq = value.parse().unwrap(),
            "urgency" => self.urgency = value.parse().unwrap(),
            "priority" => self.priority = value.parse().unwrap(),
            "routine" => self.routine = value.parse().unwrap(),
            "extraction_equipment" => self.extraction_equipment = value.parse().unwrap(),
            "security" => self.security = value.parse().unwrap(),
            "markings" => self.markings = value.parse().unwrap(),
            "us_military" => self.us_military = value.parse().unwrap(),
            "us_civilian" => self.us_civilian = value.parse().unwrap(),
            "nonus_military" => self.nonus_military = value.parse().unwrap(),
            "nonus_civilian" => self.nonus_civilian = value.parse().unwrap(),
            "epw" => self.epw = value.parse().unwrap(),
            "child" => self.child = value.parse().unwrap(),
            "terrain_none" => self.terrain_none = value.parse().unwrap(),
            "obstacles" => self.obstacles = value.to_string(),
            "medline_remarks" => self.medline_remarks = value.to_string(),
            "zone_prot_selection" => self.zone_prot_selection = value.parse().unwrap(),
            "zone_protected_coord" => self.zone_protected_coord = value.to_string(),
            "zone_prot_marker" => self.zone_prot_marker = value.to_string(),
            "contact_callsign" => self.contact_callsign = value.to_string(),
            _ => println!("Field not found"),
        }
    }
    fn get_cot(&self) -> CursorOnTarget {
        self.cot.clone()
    }
}