ogn_parser/
server_response.rs

1use std::str::FromStr;
2
3use serde::Serialize;
4
5use crate::AprsError;
6use crate::AprsPacket;
7use crate::Comment;
8use crate::ServerComment;
9
10#[allow(clippy::large_enum_variant)]
11#[derive(PartialEq, Debug, Clone, Serialize)]
12#[serde(rename_all = "snake_case")]
13pub enum ServerResponse {
14    AprsPacket(AprsPacket),
15    ServerComment(ServerComment),
16    Comment(Comment),
17    ParserError(AprsError),
18}
19
20impl FromStr for ServerResponse {
21    type Err = AprsError;
22
23    fn from_str(s: &str) -> Result<ServerResponse, Self::Err> {
24        if s.starts_with("#") {
25            match ServerComment::from_str(s) {
26                Ok(server_comment) => Ok(ServerResponse::ServerComment(server_comment)),
27                Err(_) => Ok(ServerResponse::Comment(s.parse::<Comment>().unwrap())),
28            }
29        } else {
30            match AprsPacket::from_str(s) {
31                Ok(aprs_packet) => Ok(ServerResponse::AprsPacket(aprs_packet)),
32                Err(err) => Ok(ServerResponse::ParserError(err)),
33            }
34        }
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use super::*;
41
42    #[test]
43    fn parse_aprs_packet() {
44        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>();
45        if let Ok(ServerResponse::AprsPacket(_)) = result {
46            // Do nothing, we expect this to be an AprsPacket
47        } else {
48            panic!("Expected AprsPacket, got something else");
49        }
50    }
51
52    #[test]
53    fn parse_server_comment() {
54        let result =
55            r"# aprsc 2.1.4-g408ed49 17 Mar 2018 09:30:36 GMT GLIDERN1 37.187.40.234:10152"
56                .parse::<ServerResponse>();
57        if let Ok(ServerResponse::ServerComment(_)) = result {
58            // Do nothing, we expect this to be a ServerComment
59        } else {
60            panic!("Expected ServerComment, got something else");
61        }
62    }
63
64    #[test]
65    fn parse_comment() {
66        let result = r"# This is a test comment".parse::<ServerResponse>();
67        if let Ok(ServerResponse::Comment(_)) = result {
68            // Do nothing, we expect this to be a Comment
69        } else {
70            panic!("Expected Comment, got something else");
71        }
72    }
73
74    #[test]
75    fn parse_invalid() {
76        let result = r"INVALID APRS PACKET".parse::<ServerResponse>();
77        if let Ok(ServerResponse::ParserError(_)) = result {
78            // Do nothing, we expect this to be an InvalidWtf
79        } else {
80            panic!("Expected InvalidWtf, got something else");
81        }
82    }
83}