sct_reader/package/
facility.rs

1use std::collections::HashMap;
2use std::path::Display;
3use anyhow::anyhow;
4use serde::{Deserialize, Serialize};
5use crate::loaders::vnas_crc::CrcVideoMapRef;
6use crate::loaders::vnas_crc::facility::CrcFacility;
7use super::display::AtcDisplay;
8use super::position::AtcPosition;
9
10#[derive(Debug, Clone, Default, Serialize, Deserialize)]
11pub struct AtcFacility {
12    pub name: String,
13    pub displays: Vec<AtcDisplay>,
14    pub child_facilities: Vec<AtcFacility>,
15    pub positions: Vec<AtcPosition>
16}
17
18impl AtcFacility {
19    pub fn try_from_crc(value: &CrcFacility, maps: &HashMap<String, CrcVideoMapRef>) -> anyhow::Result<Self> {
20        let mut children = Vec::new();
21
22        // Process child facilities
23        for child in &value.child_facilities {
24            children.push(AtcFacility::try_from_crc(child, &maps)?);
25        }
26
27        // Process displays
28        let mut displays = Vec::new();
29
30        if let Some(stars_cfg) = &value.stars_configuration {
31            displays.append(&mut AtcDisplay::from_crc_stars(stars_cfg, &maps));
32        }
33
34        if let Some(eram_cfg) = &value.eram_configuration {
35            displays.append(&mut AtcDisplay::from_crc_eram(eram_cfg, &maps));
36        }
37
38        if let Some(asdex_cfg) = &value.asdex_configuration {
39            displays.push(AtcDisplay::from_crc_twr_asdex("asdex-day".to_string(), "ASDE-X (Day)".to_string(), asdex_cfg));
40            displays.push(AtcDisplay::from_crc_twr_asdex("asdex-night".to_string(), "ASDE-X (Night)".to_string(), asdex_cfg));
41        }
42        if let Some(twr_cfg) = &value.tower_cab_configuration {
43            displays.push(AtcDisplay::from_crc_twr_asdex("twrcab".to_string(), "Tower Cab".to_string(), twr_cfg));
44        }
45
46        Ok(Self {
47            name: value.name.to_string(),
48            child_facilities: children,
49            displays: displays,
50            positions: Vec::new()
51        })
52    }
53}