traaains/sim/signal/
main.rs1use std::fmt::Display;
5
6use strum::{EnumDiscriminants, EnumIter};
7
8#[derive(Default, PartialEq, Eq, EnumIter)]
12pub enum MaxSpeed {
13 #[default]
14 Thirty,
15 Forty,
16 Sixty,
17 Eighty,
18 Hundred,
19}
20
21impl From<MaxSpeed> for u32 {
22 fn from(value: MaxSpeed) -> Self {
23 match value {
24 MaxSpeed::Thirty => 30,
25 MaxSpeed::Forty => 40,
26 MaxSpeed::Sixty => 60,
27 MaxSpeed::Eighty => 80,
28 MaxSpeed::Hundred => 100,
29 }
30 }
31}
32
33#[derive(EnumDiscriminants)]
40#[strum_discriminants(derive(EnumIter))]
41pub enum MainSignalState {
42 Stop {
43 summon: bool,
44 },
45 Warning {
46 max_speed: Option<MaxSpeed>,
48 next_speed: Option<MaxSpeed>,
50 },
51 Free {
52 max_speed: Option<MaxSpeed>,
54 },
55}
56
57impl Default for MainSignalState {
58 fn default() -> Self {
59 MainSignalState::Stop {
60 summon: Default::default(),
61 }
62 }
63}
64
65impl Display for MainSignalStateDiscriminants {
66 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
67 match self {
68 MainSignalStateDiscriminants::Stop => write!(f, "Stop"),
69 MainSignalStateDiscriminants::Warning => write!(f, "Warning"),
70 MainSignalStateDiscriminants::Free => write!(f, "Free"),
71 }
72 }
73}
74
75impl TryFrom<usize> for MainSignalStateDiscriminants {
76 type Error = &'static str;
77
78 fn try_from(value: usize) -> Result<Self, Self::Error> {
79 match value {
80 0 => Ok(MainSignalStateDiscriminants::Stop),
81 1 => Ok(MainSignalStateDiscriminants::Warning),
82 2 => Ok(MainSignalStateDiscriminants::Free),
83 _ => Err("Invalid parameter"),
84 }
85 }
86}
87
88#[derive(Default)]
90pub struct MainSignal {
91 pub state: MainSignalState,
92 pub is_repeat: bool,
94}