netter 0.3.1

Netter is a CLI tool for fast and easy server startup!
use clap::{Parser, Subcommand};
use commands::start::{self, start_with_config, start_without_config};
use commands::stop::stop;
use crate::state::load_state;
use crate::commands::macros as logger;
use log::{
    info,
    warn,
    error,
    debug,
    trace
};

mod commands;
mod state;
mod core;

#[derive(Parser, Debug)]
#[command(name = "netter")]
#[command(about = "The Netter will help you create servers easily and quickly.")]
struct Cli {
    #[arg(long)]
    config: Option<String>,

    #[arg(short)]
    verbose: bool,

    #[arg()]
    command: Option<String>,

    #[command(subcommand)]
    subcommand: Option<Commands>,
}

#[derive(Subcommand, Debug)]
enum Commands {
    Start {
        #[arg(long)]
        tcp: bool,

        #[arg(long)]
        udp: bool,

        #[arg(long)]
        websocket: bool,

        #[arg(long)]
        http: bool,

        #[arg(long)]
        path: Option<String>,

        #[arg(long)]
        host: Option<String>,

        #[arg(long)]
        port: Option<u16>,

        #[arg(long, default_value_t = false)]
        protect: bool,
    },
    Stop,
    Parse {
        #[arg(long)]
        path: String,
    },
    Client,
    Version,
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let name: String = logger::generate_name();

    if let Err(e) = logger::init(Some(&name)) {
        eprintln!("Failed to initialize logger: {}", e);
        return Err(Box::<dyn std::error::Error>::from(
            "Failed to initialize logger"));
    }

    trace!("Logger initialized successfully");

    let cli = Cli::parse();

    match cli.subcommand {
        Some(Commands::Start { tcp, udp, websocket, http, path, host, port, protect}) => {
            if let Some(path) = path {
                info!("Starting with conifg: {}", path.clone());
                start_with_config(tcp, udp, websocket, http, &path).await?;
            } else {
                info!("Starting without config");
                start_without_config(tcp, udp, websocket, http, protect, host, port).await?;
            }
            Ok(())
        },
        Some(Commands::Stop) => {
            if let Some(state) = load_state() {
                stop(state.pid).await?;
                Ok(())
            } else {
                Err(Box::<dyn std::error::Error>::from(
                    "Server not running"))
            }
        },
        Some(Commands::Parse { path }) => {
            commands::start::start_parse(path).await;
            Ok(())
        },
        Some(Commands::Client) => {
            start::start_client();
            Ok(())
        },
        Some(Commands::Version) => {
            println!("Netter version 0.3.0");
            Ok(())
        }
        None => {
            Err(Box::<dyn std::error::Error>::from(
                "No command provided. Use --help for more information."))
        }
    }
}