release-tool 0.3.0

Configuration-driven release lifecycle for computed-parameter repositories
Documentation
use std::fmt::{self, Display};
use std::io::Write;

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(crate) enum ReleasePhase {
    Resolve,
    Doctor,
    Inspect,
    Prepare,
    Seal,
    Publish,
    Verify,
}

impl Display for ReleasePhase {
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Self::Resolve => formatter.write_str("Resolve"),
            Self::Doctor => formatter.write_str("Doctor"),
            Self::Inspect => formatter.write_str("Inspect"),
            Self::Prepare => formatter.write_str("Prepare"),
            Self::Seal => formatter.write_str("Seal"),
            Self::Publish => formatter.write_str("Publish"),
            Self::Verify => formatter.write_str("Verify"),
        }
    }
}

pub(crate) trait ProgressReporter {
    fn report(&self, phase: ReleasePhase, detail: &str);
}

pub(crate) struct NoopProgressReporter;

impl ProgressReporter for NoopProgressReporter {
    fn report(&self, _phase: ReleasePhase, _detail: &str) {}
}

pub(crate) struct StderrProgressReporter;

impl ProgressReporter for StderrProgressReporter {
    fn report(&self, phase: ReleasePhase, detail: &str) {
        let mut stderr = std::io::stderr().lock();
        let _ = writeln!(stderr, "[release-tool] {phase}: {detail}");
        let _ = stderr.flush();
    }
}