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();
}
}