managecraft 0.1.0

A CLI Utility to communicate with your Minecraft server over the RCON protocol.
Documentation
use managecraft::commands::{parse_opts, SubCommand};
use managecraft::settings::Settings;

use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let opts = parse_opts();
    let settings = Settings::new()?;

    let mut client = instantiate_client(settings).await;

    let res = match opts.subcmd {
        SubCommand::Execute(ex) => {
            println!("{}", ex);
            client.execute(ex).await?
        }
        SubCommand::Say(s) => {
            println!("{}", s);
            client.say(s).await?
        }
        SubCommand::SaveAll(s) => {
            println!("{}", s);
            client.save_all(s).await?
        }
    };

    if !res.trim().is_empty() {
        println!("Response: {}", res)
    }

    Ok(())
}

async fn instantiate_client(settings: Settings) -> managecraft::Client {
    println!(
        "Attempting to connect to {}:{}",
        settings.url, settings.port
    );

    match managecraft::Client::new(settings).await {
        Ok(c) => {
            println!("Successfully connected to server!");
            return c;
        }
        Err(rcon::Error::Auth) => {
            eprintln!("Authentication failed");
        }
        Err(rcon::Error::Io(e)) => match e.kind() {
            std::io::ErrorKind::ConnectionRefused => {
                eprintln!("Connection Refused: Is the server running?")
            }
            _ => eprintln!("IO Error: {}", e),
        },
        Err(e) => {
            eprintln!("Error: {}", e);
        }
    };

    std::process::exit(1);
}