use clap::{Args, Parser, Subcommand, ValueEnum};
#[derive(Debug, Parser)]
#[command(
name = "alp",
version,
about = "ALP CLI — board configuration, generation, and project tooling.",
propagate_version = true
)]
pub struct Cli {
#[command(flatten)]
pub global: GlobalArgs,
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Clone, Args)]
pub struct GlobalArgs {
#[arg(long, global = true, value_name = "PATH")]
pub project: Option<String>,
#[arg(long = "board-yaml", global = true, value_name = "PATH")]
pub board_yaml: Option<String>,
#[arg(long = "sdk-root", global = true, value_name = "PATH")]
pub sdk_root: Option<String>,
#[arg(long, global = true, value_name = "EMIT")]
pub target: Option<String>,
#[arg(long, global = true)]
pub all: bool,
#[arg(long, global = true, value_enum, default_value_t = Format::Text)]
pub format: Format,
#[arg(long, global = true)]
pub verbose: bool,
#[arg(long, global = true)]
pub quiet: bool,
#[arg(long = "no-color", global = true)]
pub no_color: bool,
#[arg(long = "non-interactive", global = true)]
pub non_interactive: bool,
#[arg(long, global = true)]
pub ci: bool,
}
impl GlobalArgs {
pub fn is_json(&self) -> bool {
matches!(self.format, Format::Json)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum Format {
Text,
Json,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Validate(ValidateArgs),
Generate,
Init(InitArgs),
Scaffold(ScaffoldArgs),
Doctor(DoctorArgs),
Completion(CompletionArgs),
Diff,
Presets,
Explain(ExplainArgs),
Inspect(InspectArgs),
Trace(TraceArgs),
DebugConfig(DebugConfigArgs),
SupportBundle(SupportBundleArgs),
Sdk(SdkArgs),
Bootstrap(BootstrapArgs),
Build(BuildArgs),
Image(WestForwardArgs),
Flash(WestForwardArgs),
Clean(WestForwardArgs),
Renode(WestForwardArgs),
}
#[derive(Debug, Args)]
pub struct WestForwardArgs {
#[arg(
trailing_var_arg = true,
allow_hyphen_values = true,
value_name = "ARGS"
)]
pub args: Vec<String>,
}
#[derive(Debug, Args)]
pub struct BuildArgs {
#[arg(long)]
pub plan: bool,
#[arg(long = "plan-from", value_name = "FILE")]
pub plan_from: Option<String>,
#[arg(long)]
pub materialise: bool,
#[arg(long)]
pub native: bool,
#[arg(long)]
pub manifest: bool,
#[arg(long = "manifest-from", value_name = "FILE")]
pub manifest_from: Option<String>,
#[arg(
trailing_var_arg = true,
allow_hyphen_values = true,
value_name = "ARGS"
)]
pub args: Vec<String>,
}
#[derive(Debug, Args)]
pub struct BootstrapArgs {
#[arg(long = "no-pip")]
pub no_pip: bool,
#[arg(long = "no-west")]
pub no_west: bool,
#[arg(long = "print-env")]
pub print_env: bool,
}
#[derive(Debug, Args)]
pub struct SdkArgs {
#[arg(value_name = "SUBCOMMAND")]
pub subcommand: Option<String>,
#[arg(value_name = "ARG")]
pub arg: Option<String>,
#[arg(long)]
pub destination: Option<String>,
}
#[derive(Debug, Args)]
pub struct SupportBundleArgs {
#[arg(long = "target-kind", value_name = "KIND")]
pub target_kind: Option<String>,
#[arg(long, value_name = "SERVER")]
pub server: Option<String>,
#[arg(long)]
pub path: Option<String>,
#[arg(long)]
pub destination: Option<String>,
}
#[derive(Debug, Args)]
pub struct DebugConfigArgs {
#[arg(long = "target-kind", value_name = "KIND")]
pub target_kind: Option<String>,
#[arg(long, value_name = "SERVER")]
pub server: Option<String>,
#[arg(long)]
pub preview: bool,
}
#[derive(Debug, Args)]
pub struct ExplainArgs {
#[arg(long)]
pub template: Option<String>,
}
#[derive(Debug, Args)]
pub struct InspectArgs {
#[arg(long)]
pub path: Option<String>,
#[arg(long = "show-origin")]
pub show_origin: bool,
}
#[derive(Debug, Args)]
pub struct TraceArgs {
#[arg(long)]
pub path: Option<String>,
}
#[derive(Debug, Args)]
pub struct CompletionArgs {
#[arg(long, value_name = "SHELL")]
pub shell: Option<String>,
}
#[derive(Debug, Args)]
pub struct DoctorArgs {
#[arg(long = "target-kind", value_name = "KIND")]
pub target_kind: Option<String>,
#[arg(long, value_name = "SERVER")]
pub server: Option<String>,
#[arg(long)]
pub build: bool,
}
#[derive(Debug, Args)]
pub struct ValidateArgs {
#[arg(long)]
pub offline: bool,
}
#[derive(Debug, Args)]
pub struct InitArgs {
#[arg(long)]
pub template: Option<String>,
#[arg(long)]
pub name: Option<String>,
#[arg(long)]
pub destination: Option<String>,
#[arg(long)]
pub som: Option<String>,
#[arg(long)]
pub cores: Option<String>,
#[arg(long)]
pub preview: bool,
#[arg(long)]
pub force: bool,
}
#[derive(Debug, Args)]
pub struct ScaffoldArgs {
#[arg(long)]
pub template: Option<String>,
#[arg(long)]
pub name: Option<String>,
#[arg(long)]
pub destination: Option<String>,
#[arg(long)]
pub preview: bool,
#[arg(long)]
pub force: bool,
}