summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHermes Agent <hermes@localhost>2026-08-12 00:03:21 +0000
committerHermes Agent <hermes@localhost>2026-08-12 00:03:21 +0000
commit191e2b7429ff4547b5fdd0fbfcff943ce96c2d68 (patch)
treea7f989330ac0d2f2de13f67d4c897943391c5a55 /src
parent25f39c857da591c665865b77483b79495caf5e00 (diff)
Add explicit image builder CLI commands
Diffstat (limited to 'src')
-rw-r--r--src/cli.rs58
-rw-r--r--src/lib.rs1
-rw-r--r--src/main.rs9
3 files changed, 66 insertions, 2 deletions
diff --git a/src/cli.rs b/src/cli.rs
new file mode 100644
index 0000000..de9404a
--- /dev/null
+++ b/src/cli.rs
@@ -0,0 +1,58 @@
+use std::path::PathBuf;
+
+use anyhow::{bail, Result};
+use clap::{Parser, Subcommand};
+
+use crate::{BuildPlan, ImageSpec};
+
+#[derive(Debug, Parser)]
+#[command(name = "alt-controller-image", about = "Native ALT image builder")]
+pub struct Cli {
+ #[command(subcommand)]
+ pub command: Command,
+}
+
+#[derive(Debug, Subcommand)]
+pub enum Command {
+ /// Validate an image specification and render its build intent.
+ Plan {
+ #[arg(long)]
+ spec: PathBuf,
+ },
+ /// Build an image from a specification.
+ Build {
+ #[arg(long)]
+ spec: PathBuf,
+ #[arg(long)]
+ workspace: PathBuf,
+ #[arg(long)]
+ output: PathBuf,
+ },
+ /// Inspect a built artifact.
+ Inspect {
+ #[arg(long)]
+ artifact: PathBuf,
+ },
+ /// Compare two built artifacts semantically.
+ Compare {
+ #[arg(long)]
+ left: PathBuf,
+ #[arg(long)]
+ right: PathBuf,
+ },
+}
+
+pub fn run(cli: Cli) -> Result<()> {
+ match cli.command {
+ Command::Plan { spec } => {
+ let plan = BuildPlan::compile(ImageSpec::load(&spec)?)?;
+ println!("target: {}", plan.spec().target.name);
+ println!("architecture: {}", plan.spec().target.architecture.as_str());
+ println!("format: tar");
+ Ok(())
+ }
+ Command::Build { .. } => bail!("build execution is not available yet"),
+ Command::Inspect { .. } => bail!("artifact inspection is not available yet"),
+ Command::Compare { .. } => bail!("artifact comparison is not available yet"),
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
index a62cbde..52a875d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,3 +1,4 @@
+pub mod cli;
pub mod model;
pub mod plan;
diff --git a/src/main.rs b/src/main.rs
index 1ca0cab..1e06263 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,4 +1,9 @@
+use alt_controller_image::cli::{run, Cli};
+use clap::Parser;
+
fn main() {
- eprintln!("The command-line interface is not available yet. Use the library to load an ImageSpec.");
- std::process::exit(2);
+ if let Err(error) = run(Cli::parse()) {
+ eprintln!("error: {error:#}");
+ std::process::exit(1);
+ }
}