diff --git a/src/cli/ahab.rs b/src/cli/ahab.rs new file mode 100644 index 0000000..e278295 --- /dev/null +++ b/src/cli/ahab.rs @@ -0,0 +1,37 @@ +use super::{Django, Docker, DockerCompose, Postgres}; +use clap::{Parser, Subcommand}; + +/// A program for interacting with various dockerized applications. +#[derive(Parser, Debug)] +#[command(author, version, about, long_about=None)] +pub struct Ahab { + #[command(subcommand)] + pub command: Commands, +} + +#[derive(Debug, Subcommand)] +pub enum Commands { + /// Docker related subcommands + D { + #[command(subcommand)] + command: Docker, + }, + + /// Docker compose related subcommands + Dc { + #[command(subcommand)] + command: DockerCompose, + }, + + /// Docker compose related subcommands + Dj { + #[command(subcommand)] + command: Django, + }, + + /// Postgres related subcommands + Pg { + #[command(subcommand)] + command: Postgres, + }, +} diff --git a/src/cli/django.rs b/src/cli/django.rs new file mode 100644 index 0000000..fa6e88c --- /dev/null +++ b/src/cli/django.rs @@ -0,0 +1,29 @@ +use std::path::PathBuf; + +use clap::Parser; + +#[derive(Parser, Debug)] +pub enum Django { + /// Prepare empty management command 'command' in app 'app'. + MakeCommand { + #[arg(value_enum)] + app: PathBuf, + #[arg(value_enum)] + command: String, + }, + + /// Run Django's manage.py makemigrations. + Makemigrations, + + /// Pass arguments to Django's manage.py. + Manage { + #[arg(value_enum)] + rest: Vec, + }, + + /// Run Django's manage.py migrate. + Migrate, + + /// Run Django's manage.py shell. + Shell, +} diff --git a/src/cli/docker.rs b/src/cli/docker.rs new file mode 100644 index 0000000..3945c00 --- /dev/null +++ b/src/cli/docker.rs @@ -0,0 +1,7 @@ +use clap::Parser; + +#[derive(Parser, Debug)] +pub enum Docker { + /// Stop all containers via `docker stop $(docker ps -q)` + StopAll, +} diff --git a/src/cli/docker_compose.rs b/src/cli/docker_compose.rs new file mode 100644 index 0000000..70b066f --- /dev/null +++ b/src/cli/docker_compose.rs @@ -0,0 +1,26 @@ +use clap::Subcommand; + +/// Wraper for docker compose; autodiscover compose file and source .env file. +#[derive(Subcommand, Debug)] +pub enum DockerCompose { + /// Build containers. + Build, + + /// Down containers. + Down, + + /// Stop, build and start containers. + Rebuild, + + /// Stop and start containers. + Restart, + + /// Start containers. + Start, + + /// Stop containers. + Stop, + + /// Up containers. + Up, +} diff --git a/src/cli/mod.rs b/src/cli/mod.rs new file mode 100644 index 0000000..2e335a3 --- /dev/null +++ b/src/cli/mod.rs @@ -0,0 +1,11 @@ +mod ahab; +mod django; +mod docker; +mod docker_compose; +mod postgres; + +pub use ahab::{Ahab, Commands}; +pub use django::Django; +pub use docker::Docker; +pub use docker_compose::DockerCompose; +pub use postgres::Postgres; diff --git a/src/cli/postgres.rs b/src/cli/postgres.rs new file mode 100644 index 0000000..3a0b71f --- /dev/null +++ b/src/cli/postgres.rs @@ -0,0 +1,18 @@ +use std::path::PathBuf; + +use clap::Subcommand; + +#[derive(Subcommand, Debug)] +pub enum Postgres { + /// Import dump via pg_restore + Import { + #[arg(value_enum)] + path: PathBuf, + }, + + /// Dump via pg_dump with format=c + Dump { + #[arg(value_enum)] + path: PathBuf, + }, +} diff --git a/src/main.rs b/src/main.rs index 37f1399..958fff8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,39 @@ +mod cli; +mod scripts; + use anyhow::Result; +use clap::Parser; fn main() -> Result<()> { + let args = cli::Ahab::parse(); + + match args.command { + cli::Commands::D { command } => match command { + cli::Docker::StopAll => scripts::docker::stop_all(), + }, + cli::Commands::Dc { command } => match command { + cli::DockerCompose::Build => scripts::docker_compose::build(), + cli::DockerCompose::Down => scripts::docker_compose::down(), + cli::DockerCompose::Rebuild => scripts::docker_compose::rebuild(), + cli::DockerCompose::Restart => scripts::docker_compose::restart(), + cli::DockerCompose::Start => scripts::docker_compose::start(), + cli::DockerCompose::Stop => scripts::docker_compose::stop(), + cli::DockerCompose::Up => scripts::docker_compose::up(), + }, + cli::Commands::Dj { command } => match command { + cli::Django::MakeCommand { app, command } => { + scripts::django::make_command(&app, &command) + } + cli::Django::Makemigrations => scripts::django::makemigrations(), + cli::Django::Manage { rest } => scripts::django::manage(&rest), + cli::Django::Migrate => scripts::django::migrate(), + cli::Django::Shell => scripts::django::shell(), + }, + cli::Commands::Pg { command } => match command { + cli::Postgres::Import { path } => scripts::postgres::import(&path), + cli::Postgres::Dump { path } => scripts::postgres::dump(&path), + }, + }; + Ok(()) } diff --git a/src/scripts/django.rs b/src/scripts/django.rs new file mode 100644 index 0000000..3bd4fec --- /dev/null +++ b/src/scripts/django.rs @@ -0,0 +1,19 @@ +use std::path::PathBuf; + +pub fn make_command(app: &PathBuf, command: &str) { + println!("{app:?} and {command:?}"); + todo!() +} +pub fn makemigrations() { + todo!() +} +pub fn manage(command: &[String]) { + println!("{command:?}"); + todo!() +} +pub fn migrate() { + todo!() +} +pub fn shell() { + todo!() +} diff --git a/src/scripts/docker.rs b/src/scripts/docker.rs new file mode 100644 index 0000000..34557ae --- /dev/null +++ b/src/scripts/docker.rs @@ -0,0 +1,3 @@ +pub fn stop_all() { + todo!() +} diff --git a/src/scripts/docker_compose.rs b/src/scripts/docker_compose.rs new file mode 100644 index 0000000..9b633d2 --- /dev/null +++ b/src/scripts/docker_compose.rs @@ -0,0 +1,21 @@ +pub fn build() { + todo!() +} +pub fn down() { + todo!() +} +pub fn rebuild() { + todo!() +} +pub fn restart() { + todo!() +} +pub fn start() { + todo!() +} +pub fn stop() { + todo!() +} +pub fn up() { + todo!() +} diff --git a/src/scripts/mod.rs b/src/scripts/mod.rs new file mode 100644 index 0000000..d9e926b --- /dev/null +++ b/src/scripts/mod.rs @@ -0,0 +1,4 @@ +pub mod django; +pub mod docker; +pub mod docker_compose; +pub mod postgres; diff --git a/src/scripts/postgres.rs b/src/scripts/postgres.rs new file mode 100644 index 0000000..0fba88f --- /dev/null +++ b/src/scripts/postgres.rs @@ -0,0 +1,11 @@ +use std::path::PathBuf; + +pub fn import(path: &PathBuf) { + println!("{path:?}"); + todo!() +} + +pub fn dump(path: &PathBuf) { + println!("{path:?}"); + todo!() +}