use crate::progress::AnalysisProgress;
use indicatif::{ProgressBar, ProgressStyle};
pub struct Spinner {
bar: ProgressBar,
}
impl Spinner {
pub fn start(message: &str) -> Self {
let bar = ProgressBar::new_spinner();
bar.set_style(
ProgressStyle::with_template("{spinner:.cyan} {msg}")
.expect("static spinner template is valid"),
);
bar.enable_steady_tick(std::time::Duration::from_millis(100));
bar.set_message(message.to_string());
Self { bar }
}
pub fn set_message(&self, message: &str) {
self.bar.set_message(message.to_string());
}
pub fn finish_and_clear(&self) {
self.bar.finish_and_clear();
}
}
impl AnalysisProgress for Spinner {
fn set_phase(&self, phase: AnalysisPhase) {
self.set_message(phase_message(phase));
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AnalysisPhase {
Starting,
ResolvingPr,
Diffing,
BuildingDependencyIndex,
ParsingRepository,
AnalyzingDiff,
}
pub fn phase_message(phase: AnalysisPhase) -> &'static str {
match phase {
AnalysisPhase::Starting => "Starting...",
AnalysisPhase::ResolvingPr => "Resolving PR...",
AnalysisPhase::Diffing => "Diffing...",
AnalysisPhase::BuildingDependencyIndex => "Building dependency index...",
AnalysisPhase::ParsingRepository => "Parsing repository...",
AnalysisPhase::AnalyzingDiff => "Analyzing diff...",
}
}
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
use rstest::rstest;
#[rstest]
#[case::should_return_starting_message_when_phase_is_starting(
AnalysisPhase::Starting,
"Starting..."
)]
#[case::should_return_resolving_pr_message_when_phase_is_resolving_pr(
AnalysisPhase::ResolvingPr,
"Resolving PR..."
)]
#[case::should_return_diffing_message_when_phase_is_diffing(
AnalysisPhase::Diffing,
"Diffing..."
)]
#[case::should_return_dependency_index_message_when_phase_is_building_dependency_index(
AnalysisPhase::BuildingDependencyIndex,
"Building dependency index..."
)]
#[case::should_return_parsing_repository_message_when_phase_is_parsing_repository(
AnalysisPhase::ParsingRepository,
"Parsing repository..."
)]
#[case::should_return_analyzing_diff_message_when_phase_is_analyzing_diff(
AnalysisPhase::AnalyzingDiff,
"Analyzing diff..."
)]
fn phase_message_returns_expected_text_per_phase(
#[case] phase: AnalysisPhase,
#[case] expected: &str,
) {
let actual = phase_message(phase);
assert_eq!(expected, actual);
}
}