mod app;
mod build_view;
mod logger;
mod widgets;
pub use app::{BuildState, BuildTui, InstructionState, StageState};
pub use build_view::BuildView;
pub use logger::PlainLogger;
pub use zlayer_tui::widgets::scrollable_pane::OutputLine;
#[derive(Debug, Clone)]
pub enum BuildEvent {
StageStarted {
index: usize,
name: Option<String>,
base_image: String,
},
InstructionStarted {
stage: usize,
index: usize,
instruction: String,
},
Output {
line: String,
is_stderr: bool,
},
InstructionComplete {
stage: usize,
index: usize,
cached: bool,
},
StageComplete {
index: usize,
},
BuildComplete {
image_id: String,
},
BuildFailed {
error: String,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum InstructionStatus {
#[default]
Pending,
Running,
Complete {
cached: bool,
},
Failed,
}
impl InstructionStatus {
#[must_use]
pub fn is_complete(&self) -> bool {
matches!(self, Self::Complete { .. })
}
#[must_use]
pub fn is_running(&self) -> bool {
matches!(self, Self::Running)
}
#[must_use]
pub fn is_failed(&self) -> bool {
matches!(self, Self::Failed)
}
#[must_use]
pub fn indicator(&self) -> char {
match self {
Self::Pending => '\u{25CB}', Self::Running => '\u{25B6}', Self::Complete { .. } => '\u{2713}', Self::Failed => '\u{2717}', }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_instruction_status_indicator() {
assert_eq!(InstructionStatus::Pending.indicator(), '\u{25CB}');
assert_eq!(InstructionStatus::Running.indicator(), '\u{25B6}');
assert_eq!(
InstructionStatus::Complete { cached: false }.indicator(),
'\u{2713}'
);
assert_eq!(InstructionStatus::Failed.indicator(), '\u{2717}');
}
#[test]
fn test_instruction_status_states() {
assert!(!InstructionStatus::Pending.is_complete());
assert!(!InstructionStatus::Pending.is_running());
assert!(!InstructionStatus::Pending.is_failed());
assert!(!InstructionStatus::Running.is_complete());
assert!(InstructionStatus::Running.is_running());
assert!(!InstructionStatus::Running.is_failed());
assert!(InstructionStatus::Complete { cached: false }.is_complete());
assert!(!InstructionStatus::Complete { cached: true }.is_running());
assert!(!InstructionStatus::Complete { cached: false }.is_failed());
assert!(!InstructionStatus::Failed.is_complete());
assert!(!InstructionStatus::Failed.is_running());
assert!(InstructionStatus::Failed.is_failed());
}
}