use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum View {
ActiveRuns,
ProjectList,
RunHistory,
}
impl View {
pub fn name(&self) -> &'static str {
match self {
View::ActiveRuns => "Active Runs",
View::ProjectList => "Projects",
View::RunHistory => "Run History",
}
}
pub fn all() -> &'static [View] {
&[View::ActiveRuns, View::ProjectList, View::RunHistory]
}
pub fn next(&self, skip_active_runs: bool) -> View {
let views = View::all();
let current_idx = views.iter().position(|v| v == self).unwrap_or(0);
let mut next_idx = (current_idx + 1) % views.len();
if skip_active_runs && views[next_idx] == View::ActiveRuns {
next_idx = (next_idx + 1) % views.len();
}
views[next_idx]
}
pub fn default_view(has_active_runs: bool) -> View {
if has_active_runs {
View::ActiveRuns
} else {
View::ProjectList
}
}
}
impl fmt::Display for View {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.name())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_view_name() {
assert_eq!(View::ActiveRuns.name(), "Active Runs");
assert_eq!(View::ProjectList.name(), "Projects");
assert_eq!(View::RunHistory.name(), "Run History");
}
#[test]
fn test_view_all() {
let all = View::all();
assert_eq!(all.len(), 3);
assert_eq!(all[0], View::ActiveRuns);
assert_eq!(all[1], View::ProjectList);
assert_eq!(all[2], View::RunHistory);
}
#[test]
fn test_view_next_without_skip() {
assert_eq!(View::ActiveRuns.next(false), View::ProjectList);
assert_eq!(View::ProjectList.next(false), View::RunHistory);
assert_eq!(View::RunHistory.next(false), View::ActiveRuns);
}
#[test]
fn test_view_next_with_skip_active_runs() {
assert_eq!(View::ActiveRuns.next(true), View::ProjectList);
assert_eq!(View::ProjectList.next(true), View::RunHistory);
assert_eq!(View::RunHistory.next(true), View::ProjectList);
}
#[test]
fn test_default_view_with_active_runs() {
assert_eq!(View::default_view(true), View::ActiveRuns);
}
#[test]
fn test_default_view_without_active_runs() {
assert_eq!(View::default_view(false), View::ProjectList);
}
#[test]
fn test_view_display() {
assert_eq!(format!("{}", View::ActiveRuns), "Active Runs");
assert_eq!(format!("{}", View::ProjectList), "Projects");
assert_eq!(format!("{}", View::RunHistory), "Run History");
}
}