use clap::{Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
pub fn resolve_grpc_socket_path() -> PathBuf {
if let Ok(path) = std::env::var("ARCBOX_GRPC_SOCKET") {
return PathBuf::from(path);
}
if let Ok(path) = std::env::var("ARCBOX_SOCKET") {
let docker_socket = PathBuf::from(path);
if let Some(parent) = docker_socket.parent() {
let preferred = parent.join("arcbox-grpc.sock");
if preferred.exists() {
return preferred;
}
let legacy = parent.join("arcbox.sock");
if legacy.exists() {
return legacy;
}
return preferred;
}
}
arcbox_constants::paths::HostLayout::resolve(None).grpc_socket
}
pub mod boot;
pub mod cli_plugins;
pub mod daemon;
pub mod disk;
#[cfg(target_os = "macos")]
pub mod dns;
pub mod docker;
pub mod doctor;
#[cfg(target_os = "macos")]
pub mod install;
#[cfg(target_os = "macos")]
pub mod internal;
pub mod kubernetes;
pub mod logs;
pub mod machine;
pub mod migrate;
pub mod sandbox;
pub mod setup;
pub mod symlink;
#[cfg(target_os = "macos")]
pub mod uninstall;
pub mod version;
#[derive(Parser)]
#[command(name = "abctl")]
#[command(author, version, about, long_about = None)]
#[command(propagate_version = true)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
#[arg(long, global = true)]
pub socket: Option<PathBuf>,
#[arg(long, global = true, default_value = "table")]
pub format: OutputFormat,
#[arg(long, global = true)]
pub debug: bool,
}
#[derive(Debug, Clone, Copy, Default, ValueEnum)]
pub enum OutputFormat {
#[default]
Table,
Json,
Quiet,
}
#[derive(Subcommand)]
pub enum Commands {
#[command(subcommand)]
Machine(machine::MachineCommands),
#[command(subcommand)]
Migrate(migrate::MigrateCommands),
#[command(subcommand)]
Sandbox(sandbox::SandboxCommands),
#[command(subcommand)]
Docker(docker::DockerCommands),
#[command(subcommand, alias = "k8s")]
Kubernetes(kubernetes::KubernetesCommands),
#[command(subcommand)]
Boot(boot::BootCommands),
#[command(subcommand)]
Disk(disk::DiskCommands),
#[cfg(target_os = "macos")]
#[command(subcommand)]
Dns(dns::DnsCommands),
Daemon(daemon::DaemonArgs),
Logs(logs::LogsArgs),
#[command(subcommand)]
Setup(setup::SetupCommands),
Doctor,
#[cfg(target_os = "macos")]
#[command(name = "_install", hide = true)]
Install(install::InstallArgs),
#[cfg(target_os = "macos")]
#[command(name = "_uninstall", hide = true)]
Uninstall(uninstall::UninstallArgs),
#[cfg(target_os = "macos")]
#[command(name = "_internal", hide = true, subcommand)]
Internal(internal::InternalCommands),
Info,
Version,
}