Use clap to allow selecting output format
[hlquery.git] / src / main.rs
index 55406793e1eb812b171260dc5ee2d01cefdaa431..f92d3f893f06925183171064bdd7f02c9484bda7 100644 (file)
@@ -1,12 +1,25 @@
 use std::fmt;
 use std::fmt::Display;
 use std::error::Error;
-use std::env::args;
 use std::net::{SocketAddr, SocketAddrV4, ToSocketAddrs};
+use clap::Parser;
 use serde::{Serialize, Serializer};
 use a2s::A2SClient;
 use crate::HLQueryError::{IOError,A2SError};
 
+#[derive(Parser)]
+#[command(name = "HLQuery")]
+#[command(author = "MegaBrutal")]
+#[command(version)]
+#[command(about = "Query Half-Life servers", long_about = None)]
+struct Cli {
+    #[arg(short, long)]
+    json: bool,
+
+    addresses: Vec<String>
+}
+
+
 #[derive(Debug, Serialize)]
 struct HLQueryResult {
     address:    SocketAddrV4,
@@ -33,7 +46,8 @@ struct HLQuery {
 }
 
 impl HLQuery {
-    fn new(input: String, result: Result<Vec<HLQueryResult>, HLQueryError>) -> Self {
+    fn new<S: Into<String>>(input: S, result: Result<Vec<HLQueryResult>, HLQueryError>) -> Self {
+        let input = input.into();
         Self { input, result }
     }
 }
@@ -78,8 +92,10 @@ impl From<a2s::errors::Error> for HLQueryError {
 
 
 fn main() {
+    let cli = Cli::parse();
+
     let client = A2SClient::new().unwrap();
-    let query_results: Vec<HLQuery> = args().skip(1)
+    let query_results: Vec<HLQuery> = cli.addresses.iter()
         .map(|arg| {
             let addresses = arg.to_socket_addrs();
             (arg, addresses)
@@ -97,5 +113,10 @@ fn main() {
                 |addresses| addresses.map(|addr| HLQueryResult::new(&client, addr)).collect())))
         .collect();
 
-    println!("{}\n", serde_json::to_string_pretty(&query_results).unwrap());
+    if cli.json {
+        println!("{}", serde_json::to_string_pretty(&query_results).unwrap());
+    }
+    else {
+        println!("{:?}", query_results);
+    }
 }