mod commands;
use std::path::PathBuf;
use anyhow::Result;
use clap::{Parser, Subcommand};
use crate::commands::{
aggregate::AggregateCommands,
config::ConfigArgs,
plugin::PluginCommands,
schema::SchemaCommands,
start::{DestroyArgs, StartArgs},
system::SystemCommands,
token::TokenCommands,
};
#[derive(Parser)]
#[command(author, version, about = "EventDBX server CLI")]
struct Cli {
#[arg(long)]
config: Option<PathBuf>,
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Start(StartArgs),
Stop,
Status,
Restart(StartArgs),
Destroy(DestroyArgs),
Config(ConfigArgs),
Token {
#[command(subcommand)]
command: TokenCommands,
},
Schema {
#[command(subcommand)]
command: SchemaCommands,
},
Plugin {
#[command(subcommand)]
command: PluginCommands,
},
Aggregate {
#[command(subcommand)]
command: AggregateCommands,
},
System {
#[command(subcommand)]
command: SystemCommands,
},
#[command(name = "__internal:server", hide = true)]
InternalServer,
}
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
.with_target(false)
.init();
let Cli { config, command } = Cli::parse();
match command {
Commands::Start(args) => commands::start::execute(config, args).await?,
Commands::Stop => commands::start::stop(config)?,
Commands::Status => commands::start::status(config)?,
Commands::Restart(args) => restart(config, args).await?,
Commands::Destroy(args) => commands::start::destroy(config, args)?,
Commands::Config(args) => commands::config::execute(config, args)?,
Commands::Token { command } => commands::token::execute(config, command)?,
Commands::Schema { command } => commands::schema::execute(config, command)?,
Commands::Plugin { command } => commands::plugin::execute(config, command)?,
Commands::Aggregate { command } => commands::aggregate::execute(config, command)?,
Commands::System { command } => commands::system::execute(config, command)?,
Commands::InternalServer => commands::start::run_internal(config).await?,
}
Ok(())
}
async fn restart(config: Option<PathBuf>, args: StartArgs) -> Result<()> {
if let Err(err) = commands::start::stop(config.clone()) {
tracing::warn!("failed to stop EventDBX server before restart: {err}");
}
commands::start::execute(config, args).await
}