From: MegaBrutal Date: Sat, 18 Feb 2023 02:50:00 +0000 (+0100) Subject: Serialize fallible values X-Git-Tag: v0.2.0~8 X-Git-Url: http://git.megabrutal.com/?p=hlquery.git;a=commitdiff_plain;h=0b2ca9e255607e16fb9d9638b89837a8cfe0ae29 Serialize fallible values --- diff --git a/Cargo.lock b/Cargo.lock index 784d70e..4a5a835 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -68,6 +68,7 @@ name = "hlquery" version = "0.1.0" dependencies = [ "a2s", + "serde", "serde_json", ] diff --git a/Cargo.toml b/Cargo.toml index a4782a9..495a427 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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" diff --git a/src/main.rs b/src/main.rs index 4a3d54e..468c5e2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.serialize_str(&format!("{self}")) + } +} + +impl From 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 = 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, 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, HLQueryError> = client.players(address).map_err(From::from); + println!("{}\n", serde_json::to_string_pretty(&result).unwrap()); } }