diff --git a/hammond-gtk/src/headerbar.rs b/hammond-gtk/src/headerbar.rs index 6648e46..e8ba764 100644 --- a/hammond-gtk/src/headerbar.rs +++ b/hammond-gtk/src/headerbar.rs @@ -1,9 +1,11 @@ +use failure::Error; +use failure::ResultExt; use gtk; use gtk::prelude::*; +use url::Url; use hammond_data::Source; use hammond_data::dbqueries; -use url::Url; use std::sync::Arc; use std::sync::mpsc::Sender; @@ -55,6 +57,7 @@ impl Default for Header { } } +// TODO: Refactor components into smaller state machines impl Header { pub fn new(content: Arc, window: >k::Window, sender: Sender) -> Header { let h = Header::default(); @@ -72,11 +75,15 @@ impl Header { self.switch.set_stack(&content.get_stack()); new_url.connect_changed(clone!(add_button => move |url| { - on_url_change(url, &result_label, &add_button); + if let Err(err) = on_url_change(url, &result_label, &add_button) { + error!("Error: {}", err); + } })); add_button.connect_clicked(clone!(add_popover, new_url, sender => move |_| { - on_add_bttn_clicked(&new_url, sender.clone()); + if let Err(err) = on_add_bttn_clicked(&new_url, sender.clone()) { + error!("Error: {}", err); + } add_popover.hide(); })); @@ -142,28 +149,32 @@ impl Header { } } -fn on_add_bttn_clicked(entry: >k::Entry, sender: Sender) { +fn on_add_bttn_clicked(entry: >k::Entry, sender: Sender) -> Result<(), Error> { let url = entry.get_text().unwrap_or_default(); - let source = Source::from_url(&url); + let source = Source::from_url(&url).context("Failed to convert url to a Source entry.")?; + entry.set_text(""); - if source.is_ok() { - entry.set_text(""); - sender.send(Action::UpdateSources(source.ok())).unwrap(); - } else { - error!("Something went wrong."); - error!("Error: {:?}", source.unwrap_err()); - } + sender + .send(Action::UpdateSources(Some(source))) + .context("App channel blew up.")?; + Ok(()) } -fn on_url_change(entry: >k::Entry, result: >k::Label, add_button: >k::Button) { - let uri = entry.get_text().unwrap(); +fn on_url_change( + entry: >k::Entry, + result: >k::Label, + add_button: >k::Button, +) -> Result<(), Error> { + let uri = entry + .get_text() + .ok_or_else(|| format_err!("GtkEntry blew up somehow."))?; debug!("Url: {}", uri); let url = Url::parse(&uri); // TODO: refactor to avoid duplication match url { Ok(u) => { - if !dbqueries::source_exists(u.as_str()).unwrap() { + if !dbqueries::source_exists(u.as_str())? { add_button.set_sensitive(true); result.hide(); result.set_label(""); @@ -172,6 +183,7 @@ fn on_url_change(entry: >k::Entry, result: >k::Label, add_button: >k::Butt result.set_label("Show already exists."); result.show(); } + Ok(()) } Err(err) => { add_button.set_sensitive(false); @@ -182,6 +194,7 @@ fn on_url_change(entry: >k::Entry, result: >k::Label, add_button: >k::Butt } else { result.hide(); } + Ok(()) } } } diff --git a/hammond-gtk/src/manager.rs b/hammond-gtk/src/manager.rs index c910889..5805a0d 100644 --- a/hammond-gtk/src/manager.rs +++ b/hammond-gtk/src/manager.rs @@ -11,6 +11,9 @@ use std::sync::mpsc::Sender; // use std::path::PathBuf; use std::thread; +// This is messy, undocumented and hacky af. +// I am terrible at writting downloaders and download managers. + #[derive(Debug)] pub struct Progress { total_bytes: u64,