anodizer-core 0.2.0

Core configuration, context, and template engine for the anodizer release tool
Documentation
//! `docker` invocations needed by the CLI's `check` command.
//!
//! Centralised here so all `Command::new("docker")` shell-outs live inside
//! the module-boundaries allow-list (`.claude/rules/module-boundaries.md`).

use std::io;
use std::process::Command;

/// Run `docker buildx version` and return whether buildx is installed and
/// reachable.
///
/// `Ok(true)` — `docker buildx version` ran and exited zero.
/// `Ok(false)` — `docker` ran but the `buildx` subcommand exited non-zero
///   (typically: docker is present but buildx plugin not installed).
/// `Err(_)` — `docker` itself could not be spawned (binary missing,
///   permission denied). Distinct from `Ok(false)` so callers can log the
///   underlying `io::Error` at trace level when surfacing "docker not
///   available" vs. "docker installed but buildx missing".
pub fn buildx_available() -> io::Result<bool> {
    Command::new("docker")
        .args(["buildx", "version"])
        .output()
        .map(|o| o.status.success())
}