diff --git a/src/tags.rs b/src/tags.rs index 7418254..921dcf8 100644 --- a/src/tags.rs +++ b/src/tags.rs @@ -29,13 +29,23 @@ pub struct Tags { pub results: Vec, } -#[derive(Debug)] +#[derive(Debug, Display)] pub enum Error { InvalidCharacter(char), Fetching(String), Converting(String), } +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Error::InvalidCharacter(c) => write!(f, "Invalid Character: {}", c), + Error::Fetching(s) => write!(f, "Fetching error: {}", s), + Error::Converting(s) => write!(f, "Converting error: {}", s), + } + } +} + impl Tags { pub fn new(repo: String) -> Result { // let repo = Self::check_repo(repo)?; @@ -102,3 +112,28 @@ fn format_time_nice(time: chrono::Duration) -> String { format!("{} Sekunden", time.num_seconds()) } } + +#[cfg(test)] +mod tests { + use crate::tags; + #[test] + fn test_check_repo() { + let check_eq = |s, s2| { + assert_eq!(&tags::Tags::check_repo(String::from(s)).unwrap(), s2); + }; + let check_neq = |s, s2| { + assert_ne!(&tags::Tags::check_repo(String::from(s)).unwrap(), s2); + }; + let check_err = |s: &str| { + assert_eq!(tags::Tags::check_repo(String::from(s)).is_err(), true); + }; + + check_eq("nginx", "library/nginx"); + check_neq("nginx", "nginx"); + check_eq("rocketchat/rocket.chat", "rocketchat/rocket.chat"); + check_eq("mysql", "library/mysql"); + check_neq("mysql", "mysql"); + check_err("nginxä"); + check_err("nginx²"); + } +} diff --git a/src/ui.rs b/src/ui.rs index 93416fd..c65e333 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -106,14 +106,14 @@ impl Ui { }, Ok(Key::Char(key)) => { if ui.state == State::EditRepo { - ui.tags = tag_list::TagList::with_status("Editing Repository"); + ui.show_info("Editing Repository"); } ui.repo.handle_input(&ui.state, Key::Char(key)); ui.tags.handle_input(&ui.state, Key::Char(key)); } Ok(Key::Backspace) => { if ui.state == State::EditRepo { - ui.tags = tag_list::TagList::with_status("Editing Repository"); + ui.show_info("Editing Repository"); } ui.repo.handle_input(&ui.state, Key::Backspace); ui.tags.handle_input(&ui.state, Key::Backspace); @@ -121,7 +121,7 @@ impl Ui { Ok(Key::Up) => { if ui.state == State::SelectService && ui.services.find_previous_match() { match ui.services.extract_repo() { - Err(_) => ui.tags = tag_list::TagList::with_status("No image found"), + Err(_) => ui.show_info("No image found"), Ok(s) => ui.repo.set(s), } } @@ -131,10 +131,13 @@ impl Ui { Ok(Key::Down) => match ui.state { State::SelectService if ui.services.find_next_match() => { match ui.services.extract_repo() { - Err(_) => ui.tags = tag_list::TagList::with_status("No image found"), + Err(e) => ui.show_info(&format!("{}", e)), Ok(s) => { let repo = match crate::tags::Tags::check_repo(s) { - Err(_) => continue, + Err(e) => { + ui.show_info(&format!("{}", e)); + continue; + } Ok(s) => s, }; ui.repo.set(repo); @@ -160,6 +163,10 @@ impl Ui { terminal.clear().unwrap(); } + fn show_info(&mut self, error: &str) { + self.tags = tag_list::TagList::with_status(error); + } + pub fn spawn_stdin_channel(&self) -> mpsc::Receiver { let (tx, rx) = mpsc::channel::(); diff --git a/src/widget/service_switcher.rs b/src/widget/service_switcher.rs index 2fa8409..fea7996 100644 --- a/src/widget/service_switcher.rs +++ b/src/widget/service_switcher.rs @@ -1,3 +1,4 @@ +use std::fmt; use std::fs::File; use std::io::BufRead; use std::io::BufReader; @@ -9,12 +10,21 @@ use tui::widgets::{Block, Borders, List, ListState}; use crate::ui::State; -#[derive(Debug)] +#[derive(Debug, Display)] pub enum Error { NoneSelected, Parsing(String), } +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Error::NoneSelected => write!(f, "None selected"), + Error::Parsing(s) => write!(f, "Parsing error: {}", s), + } + } +} + pub struct ServiceSwitcher { list: Vec, state: ListState,