doris_rs/header/
receiver.rs1use crate::{error::ParsingError, fmt_doris, prelude::FormattingError};
2
3use std::{
4 io::{BufWriter, Write},
5 str::FromStr,
6};
7
8#[cfg(feature = "serde")]
9use serde::{Deserialize, Serialize};
10
11#[derive(Default, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
13#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
14pub struct Receiver {
15 pub model: String,
17
18 pub serial_number: String,
20
21 pub firmware: String,
23}
24
25impl Receiver {
26 pub(crate) fn format<W: Write>(&self, w: &mut BufWriter<W>) -> Result<(), FormattingError> {
28 writeln!(
29 w,
30 "{}",
31 fmt_doris(
32 &format!(
33 "{:<20}{:<20}{}",
34 self.serial_number, self.model, self.firmware
35 ),
36 "REC # / TYPE / VERS"
37 )
38 )?;
39
40 Ok(())
41 }
42
43 pub fn with_model(&self, model: &str) -> Self {
44 let mut s = self.clone();
45 s.model = model.to_string();
46 s
47 }
48
49 pub fn with_serial_number(&self, serial_number: &str) -> Self {
50 let mut s = self.clone();
51 s.serial_number = serial_number.to_string();
52 s
53 }
54
55 pub fn with_firmware(&self, firmware: &str) -> Self {
56 let mut s = self.clone();
57 s.firmware = firmware.to_string();
58 s
59 }
60}
61
62impl FromStr for Receiver {
63 type Err = ParsingError;
64
65 fn from_str(line: &str) -> Result<Self, Self::Err> {
66 if line.len() < 60 {
67 return Err(ParsingError::Receiver);
68 }
69
70 let (sn, rem) = line.split_at(20);
71 let (model, rem) = rem.split_at(20);
72 let (version, _) = rem.split_at(20);
73
74 Ok(Receiver {
75 serial_number: sn.trim().to_string(),
76 model: model.trim().to_string(),
77 firmware: version.trim().to_string(),
78 })
79 }
80}
81
82#[cfg(test)]
83mod test {
84 use super::*;
85 use std::str::FromStr;
86
87 #[test]
88 fn receiver_parsing() {
89 let content = "2090088 LEICA GR50 4.51 ";
90
91 let rcvr = Receiver::from_str(content).unwrap();
92 assert_eq!(rcvr.model, "LEICA GR50");
93 assert_eq!(rcvr.firmware, "4.51");
94 assert_eq!(rcvr.serial_number, "2090088");
95 }
96}