use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(name = "vvbox")]
#[command(about = "Sandboxed runner for macOS 26 using Apple container CLI", long_about = None)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
#[allow(clippy::large_enum_variant)]
pub enum Commands {
Run {
#[arg(long)]
repo: String,
#[arg(long)]
worktree: Option<String>,
#[arg(long = "in-place")]
in_place: bool,
#[arg(long)]
config: Option<String>,
#[arg(long)]
image: Option<String>,
#[arg(long)]
network: Option<String>,
#[arg(long = "no-network")]
no_network: bool,
#[arg(long)]
workdir: Option<String>,
#[arg(long)]
task: Option<String>,
#[arg(long = "env")]
env: Vec<String>,
#[arg(long = "env-file")]
env_file: Option<String>,
#[arg(long = "port")]
port: Vec<String>,
#[arg(long = "volume")]
volume: Vec<String>,
#[arg(long = "read-only")]
read_only: bool,
#[arg(long)]
diff: bool,
#[arg(long)]
cleanup: bool,
#[arg(long = "cleanup-on-success")]
cleanup_on_success: bool,
#[arg(long)]
shell: bool,
#[arg(long)]
keep: bool,
#[arg(long)]
json: bool,
#[arg(long)]
cmd: Option<String>,
#[arg(trailing_var_arg = true)]
args: Vec<String>,
},
Diff {
#[arg(long)]
id: Option<String>,
#[arg(long)]
last: bool,
#[arg(long)]
json: bool,
},
Apply {
#[arg(long)]
id: Option<String>,
#[arg(long)]
last: bool,
#[arg(long)]
json: bool,
#[arg(long = "allow-dirty")]
allow_dirty: bool,
#[arg(long)]
yes: bool,
},
Attach {
#[arg(long)]
id: Option<String>,
#[arg(long)]
last: bool,
#[arg(long)]
shell: bool,
#[arg(long)]
cmd: Option<String>,
#[arg(trailing_var_arg = true)]
args: Vec<String>,
},
Logs {
#[arg(long)]
id: Option<String>,
#[arg(long)]
last: bool,
#[arg(long)]
tail: Option<u32>,
#[arg(long)]
since: Option<String>,
#[arg(long = "no-follow")]
no_follow: bool,
},
Services {
#[command(subcommand)]
action: ServiceCommands,
},
Up {
#[arg(long)]
repo: Option<String>,
#[arg(long)]
config: Option<String>,
#[arg(long = "restart")]
restart: bool,
},
Down {
#[arg(long)]
repo: Option<String>,
#[arg(long)]
config: Option<String>,
},
List {
#[arg(long)]
json: bool,
},
Cleanup {
#[arg(long)]
id: Option<String>,
#[arg(long)]
last: bool,
#[arg(long)]
json: bool,
},
Init {
#[arg(long)]
repo: Option<String>,
#[arg(long)]
out: Option<String>,
#[arg(long)]
force: bool,
},
}
#[derive(Subcommand)]
pub enum ServiceCommands {
Up {
#[arg(long)]
repo: Option<String>,
#[arg(long)]
config: Option<String>,
#[arg(long = "restart")]
restart: bool,
},
Down {
#[arg(long)]
repo: Option<String>,
#[arg(long)]
config: Option<String>,
},
Status {
#[arg(long)]
repo: Option<String>,
#[arg(long)]
config: Option<String>,
#[arg(long)]
json: bool,
},
Restart {
#[arg(long)]
repo: Option<String>,
#[arg(long)]
config: Option<String>,
},
Logs {
#[arg(long)]
repo: Option<String>,
#[arg(long)]
config: Option<String>,
#[arg(long)]
name: String,
#[arg(long)]
tail: Option<u32>,
#[arg(long)]
since: Option<String>,
#[arg(long = "no-follow")]
no_follow: bool,
},
}