doris_rs/header/
receiver.rs

1use 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/// GNSS receiver description
12#[derive(Default, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
13#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
14pub struct Receiver {
15    /// Receiver (hardware) model
16    pub model: String,
17
18    /// Receiver (hardware) identification info
19    pub serial_number: String,
20
21    /// Receiver embedded software info
22    pub firmware: String,
23}
24
25impl Receiver {
26    /// Formats [Receiver] into [BufWriter]
27    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}