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,
}
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 }
}
}
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)
|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);
+ }
}