Serialize fallible values
[hlquery.git] / src / main.rs
1 use std::fmt;
2 use std::fmt::Display;
3 use std::error::Error;
4 use std::env::args;
5 use std::net::{SocketAddr, ToSocketAddrs};
6 use serde::{Serialize, Serializer};
7 use a2s::A2SClient;
8 use crate::HLQueryError::A2SError;
9
10 #[derive(Debug)]
11 enum HLQueryError {
12 A2SError(a2s::errors::Error)
13 }
14
15 impl Display for HLQueryError {
16 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
17 match self {
18 A2SError(e) => write!(f, "{}", e)
19 }
20 }
21 }
22
23 impl Error for HLQueryError {}
24
25 impl Serialize for HLQueryError {
26 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
27 where
28 S: Serializer,
29 {
30 serializer.serialize_str(&format!("{self}"))
31 }
32 }
33
34 impl From<a2s::errors::Error> for HLQueryError {
35 fn from(e: a2s::errors::Error) -> Self {
36 Self::A2SError(e)
37 }
38 }
39
40
41 fn main() {
42 let client = A2SClient::new().unwrap();
43 let addresses = args().skip(1)
44 .flat_map(|arg| arg.to_socket_addrs())
45 .flat_map(|iter_addr| iter_addr.flat_map(|sa| match sa {
46 SocketAddr::V4(sa4) => Some(sa4),
47 _ => None
48 })
49 );
50
51 for address in addresses {
52
53 println!("Querying address: {}", address);
54
55 let result: Result<a2s::info::Info, HLQueryError> = client.info(address).map_err(From::from);
56 println!("{}\n", serde_json::to_string_pretty(&result).unwrap());
57
58 let result: Result<Vec<a2s::rules::Rule>, HLQueryError> = client.rules(address).map_err(From::from);
59 println!("{}\n", serde_json::to_string_pretty(&result).unwrap());
60
61 let result: Result<Vec<a2s::players::Player>, HLQueryError> = client.players(address).map_err(From::from);
62 println!("{}\n", serde_json::to_string_pretty(&result).unwrap());
63
64 }
65 }