use clap::Parser;
use serde::de::DeserializeOwned;
use dota::{Server, components::GameState};
async fn echo_handler<T>(event: bytes::Bytes)
where
T: DeserializeOwned + std::fmt::Display,
{
let value: T = match serde_json::from_slice(&event) {
Err(e) => {
log::error!("Failed to deserialize JSON body: {}", e);
panic!("deserialize error");
}
Ok(v) => v,
};
println!("{:#}", value);
}
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
#[arg(short, long)]
uri: String,
#[arg(short, long)]
raw: bool,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init();
let args = Args::parse();
let mut server = Server::new(&args.uri);
if args.raw {
server = server.register(echo_handler::<serde_json::Value>);
} else {
server = server.register(echo_handler::<GameState>);
}
server.run().await?;
Ok(())
}