1use crate::adif;
18use crate::error::RigCtlError;
19use std::fmt;
20use std::fmt::{Display, Formatter};
21use std::str::FromStr;
22
23#[derive(Debug, Copy, Clone, PartialEq, Eq)]
24pub enum Mode {
25 USB,
26 LSB,
27 CW,
28 CWR,
29 RTTY,
30 RTTYR,
31 AM,
32 FM,
33 WFM,
34 AMS,
35 PKTLSB,
36 PKTUSB,
37 PKTFM,
38 ECSSUSB,
39 ECSSLSB,
40 FAX,
41 SAM,
42 SAL,
43 SAH,
44 DSB,
45}
46
47impl Display for Mode {
48 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
49 match self {
50 Mode::USB => write!(f, "USB"),
51 Mode::LSB => write!(f, "LSB"),
52 Mode::CW => write!(f, "CW"),
53 Mode::CWR => write!(f, "CWR"),
54 Mode::RTTY => write!(f, "RTTY"),
55 Mode::RTTYR => write!(f, "RTTYR"),
56 Mode::AM => write!(f, "AM"),
57 Mode::FM => write!(f, "FM"),
58 Mode::WFM => write!(f, "WFM"),
59 Mode::AMS => write!(f, "AMS"),
60 Mode::PKTLSB => write!(f, "PKTLSB"),
61 Mode::PKTUSB => write!(f, "PKTUSB"),
62 Mode::PKTFM => write!(f, "PKTFM"),
63 Mode::ECSSUSB => write!(f, "ECSSUSB"),
64 Mode::ECSSLSB => write!(f, "ECSSLSB"),
65 Mode::FAX => write!(f, "FAX"),
66 Mode::SAM => write!(f, "SAM"),
67 Mode::SAL => write!(f, "SAL"),
68 Mode::SAH => write!(f, "SAH"),
69 Mode::DSB => write!(f, "DSB"),
70 }
71 }
72}
73
74impl FromStr for Mode {
75 type Err = RigCtlError;
76
77 fn from_str(s: &str) -> Result<Self, Self::Err> {
78 match s {
79 "USB" => Ok(Mode::USB),
80 "LSB" => Ok(Mode::LSB),
81 "CW" => Ok(Mode::CW),
82 "CWR" => Ok(Mode::CWR),
83 "RTTY" => Ok(Mode::RTTY),
84 "RTTYR" => Ok(Mode::RTTYR),
85 "AM" => Ok(Mode::AM),
86 "FM" => Ok(Mode::FM),
87 "WFM" => Ok(Mode::WFM),
88 "AMS" => Ok(Mode::AMS),
89 "PKTLSB" => Ok(Mode::PKTLSB),
90 "PKTUSB" => Ok(Mode::PKTUSB),
91 "PKTFM" => Ok(Mode::PKTFM),
92 "ECSSUSB" => Ok(Mode::ECSSUSB),
93 "ECSSLSB" => Ok(Mode::ECSSLSB),
94 "FAX" => Ok(Mode::FAX),
95 "SAM" => Ok(Mode::SAM),
96 "SAL" => Ok(Mode::SAL),
97 "SAH" => Ok(Mode::SAH),
98 "DSB" => Ok(Mode::DSB),
99 _ => Err(RigCtlError::RawDataError(format!("Unable to parse Mode with string \"{}\"", &s))),
100 }
101 }
102}
103
104impl From<Mode> for adif::Mode {
105 fn from(value: Mode) -> Self {
106 match value {
107 Mode::USB => { Self::SSB }
108 Mode::LSB => { Self::SSB }
109 Mode::CW => { Self::CW }
110 Mode::CWR => { Self::CW }
111 Mode::RTTY => { Self::RTTY }
112 Mode::RTTYR => { Self::RTTY }
113 Mode::AM => { Self::AM }
114 Mode::FM => { Self::FM }
115 Mode::WFM => { Self::FM }
116 Mode::AMS => { Self::AM }
117 Mode::PKTLSB => { Self::PKT }
118 Mode::PKTUSB => { Self::PKT }
119 Mode::PKTFM => { Self::PKT }
120 Mode::ECSSUSB => { Self::AM }
121 Mode::ECSSLSB => { Self::AM }
122 Mode::FAX => { Self::FAX }
123 Mode::SAM => { Self::AM }
124 Mode::SAL => { Self::AM }
125 Mode::SAH => { Self::AM }
126 Mode::DSB => { Self::AM }
127 }
128 }
129}