server-watchdog 0.1.0

A server monitoring and remote control tool via messenger.
Documentation
use clap::Subcommand;
use log::{debug, trace};
use crate::application::config::ServerConfigUseCase;
use crate::domain::config::ServerConfig;
use crate::domain::server::Server;
use crate::infrastructure::cli::util::{read_string, read_string_option, FormatChecker};

#[derive(Subcommand)]
#[derive(Debug)]
pub enum ServerCommands {
    Add,
    List
}

impl ServerCommands {
    pub async fn run(&self, server_config_adapter: Box<dyn ServerConfigUseCase>) {
        trace!("server command start: {:?}", &self);
        match self {
            ServerCommands::Add => {
                debug!("add server");
                println!("--- Add Server ---");
                let name = read_string("name", FormatChecker::Name).await;
                let base_url = read_string_option("base url", FormatChecker::BaseUrl).await;
                let docker_container_name = read_string_option("docker container name", FormatChecker::NotAllowWhitespace).await;
                let health_check_path = read_string_option("health check path", FormatChecker::NotAllowWhitespace).await;
                let kill_path = read_string_option("kill path", FormatChecker::NotAllowWhitespace).await;
                let log_command = read_string_option("log command", FormatChecker::None).await;

                let config = ServerConfig::new(name, base_url, docker_container_name, health_check_path, kill_path, log_command);
                debug!("new server config: {:?}", &config);
                let _ = server_config_adapter.add_server(config).await;
            },
            ServerCommands::List => {
                debug!("list server");

                let servers: Vec<ServerConfig> = server_config_adapter.list_server().await
                    .unwrap();
                debug!("servers: {:?}", &servers);

                println!("--- Server List ---");

                if servers.is_empty() {
                    println!("Empty Server");
                } else {
                    for server in servers {
                        let server = Server::from(server);

                        let command = match server.log_command.as_ref() {
                            Some(command) => command.join(" "),
                            None => "None".to_string()
                        };

                        println!(
                            "=========\nName: {}\nBASE URL: {}\nDocker Container Name: {}\nKill URL: {}\nHealth Check URL: {}\nLog command: {}\n\n",
                            server.name,
                            server.base_url.as_deref().unwrap_or("None"),
                            server.docker_container_name.as_deref().unwrap_or("None"),
                            server.get_kill_url().as_deref().unwrap_or("None"),
                            server.get_health_check_url().as_deref().unwrap_or("None"),
                            command
                        );
                    }
                }
            }
        }
        trace!("server command end");
    }
}