ogn_parser/
server_response.rs

1use std::str::FromStr;
2
3use serde::Serialize;
4
5use crate::AprsError;
6use crate::AprsPacket;
7use crate::ServerComment;
8
9#[allow(clippy::large_enum_variant)]
10#[derive(PartialEq, Debug, Clone, Serialize)]
11#[serde(rename_all = "lowercase")]
12pub enum ServerResponse {
13    AprsPacket(AprsPacket),
14    ServerComment(ServerComment),
15    ParserError(AprsError),
16}
17
18impl FromStr for ServerResponse {
19    type Err = AprsError;
20
21    fn from_str(s: &str) -> Result<ServerResponse, Self::Err> {
22        if s.starts_with("#") {
23            match ServerComment::from_str(s) {
24                Ok(server_comment) => Ok(ServerResponse::ServerComment(server_comment)),
25                Err(err) => Ok(ServerResponse::ParserError(err)),
26            }
27        } else {
28            match AprsPacket::from_str(s) {
29                Ok(aprs_packet) => Ok(ServerResponse::AprsPacket(aprs_packet)),
30                Err(err) => Ok(ServerResponse::ParserError(err)),
31            }
32        }
33    }
34}
35
36#[cfg(test)]
37mod tests {
38    use super::*;
39
40    #[test]
41    fn parse_aprs_packet() {
42        let result = r"ICA3D17F2>APRS,qAS,dl4mea:/074849h4821.61N\01224.49E^322/103/A=003054 !W46! id213D17F2 -039fpm +0.0rot 2.5dB 3e -0.0kHz gps1x1".parse::<ServerResponse>();
43        if let Ok(ServerResponse::AprsPacket(_)) = result {
44            // Do nothing, we expect this to be an AprsPacket
45        } else {
46            panic!("Expected AprsPacket, got something else");
47        }
48    }
49
50    #[test]
51    fn parse_server_comment() {
52        let result =
53            r"# aprsc 2.1.4-g408ed49 17 Mar 2018 09:30:36 GMT GLIDERN1 37.187.40.234:10152"
54                .parse::<ServerResponse>();
55        if let Ok(ServerResponse::ServerComment(_)) = result {
56            // Do nothing, we expect this to be a ServerComment
57        } else {
58            panic!("Expected ServerComment, got something else");
59        }
60    }
61
62    #[test]
63    fn parse_invalid() {
64        let result = r"INVALID APRS PACKET".parse::<ServerResponse>();
65        if let Ok(ServerResponse::ParserError(_)) = result {
66            // Do nothing, we expect this to be an InvalidWtf
67        } else {
68            panic!("Expected InvalidWtf, got something else");
69        }
70    }
71}