Serialize fallible values
authorMegaBrutal <megabrutal+github@megabrutal.com>
Sat, 18 Feb 2023 02:50:00 +0000 (03:50 +0100)
committerMegaBrutal <megabrutal+github@megabrutal.com>
Sat, 18 Feb 2023 02:50:00 +0000 (03:50 +0100)
Cargo.lock
Cargo.toml
src/main.rs

index 784d70e60f27b5633db666058316997ecc5c5766..4a5a8350f5b7e97d193348616a0cad9111629cde 100644 (file)
@@ -68,6 +68,7 @@ name = "hlquery"
 version = "0.1.0"
 dependencies = [
  "a2s",
+ "serde",
  "serde_json",
 ]
 
index a4782a99236a476a1bbf75c563fae2bb0a9fa845..495a42761a02076d6f6ba15850d5a84f2a941aa2 100644 (file)
@@ -7,4 +7,5 @@ edition = "2021"
 
 [dependencies]
 a2s = { version = "0.5.1", features = ["serialization"] }
+serde = { version = "1.0.152", features = ["derive"] }
 serde_json = "1.0.93"
index 4a3d54e87464a242b7196dab26ba9b53954b877b..468c5e2231996c9d8c019e982e8ff540962468e5 100644 (file)
@@ -1,6 +1,42 @@
+use std::fmt;
+use std::fmt::Display;
+use std::error::Error;
 use std::env::args;
 use std::net::{SocketAddr, ToSocketAddrs};
+use serde::{Serialize, Serializer};
 use a2s::A2SClient;
+use crate::HLQueryError::A2SError;
+
+#[derive(Debug)]
+enum HLQueryError {
+    A2SError(a2s::errors::Error)
+}
+
+impl Display for HLQueryError {
+    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+        match self {
+            A2SError(e) => write!(f, "{}", e)
+        }
+    }
+}
+
+impl Error for HLQueryError {}
+
+impl Serialize for HLQueryError {
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+    where
+        S: Serializer,
+    {
+        serializer.serialize_str(&format!("{self}"))
+    }
+}
+
+impl From<a2s::errors::Error> for HLQueryError {
+    fn from(e: a2s::errors::Error) -> Self {
+        Self::A2SError(e)
+    }
+}
+
 
 fn main() {
     let client = A2SClient::new().unwrap();
@@ -16,17 +52,14 @@ fn main() {
 
         println!("Querying address: {}", address);
 
-        if let Ok(result) = client.info(address) {
-            println!("{}\n", serde_json::to_string_pretty(&result).unwrap());
-        }
+        let result: Result<a2s::info::Info, HLQueryError> = client.info(address).map_err(From::from);
+        println!("{}\n", serde_json::to_string_pretty(&result).unwrap());
 
-        if let Ok(result) = client.rules(address) {
-            println!("{}\n", serde_json::to_string_pretty(&result).unwrap());
-        }
+        let result: Result<Vec<a2s::rules::Rule>, HLQueryError> = client.rules(address).map_err(From::from);
+        println!("{}\n", serde_json::to_string_pretty(&result).unwrap());
 
-        if let Ok(result) = client.players(address) {
-            println!("{}\n", serde_json::to_string_pretty(&result).unwrap());
-        }
+        let result: Result<Vec<a2s::players::Player>, HLQueryError> = client.players(address).map_err(From::from);
+        println!("{}\n", serde_json::to_string_pretty(&result).unwrap());
 
     }
 }