From 4582bcd5ae6a5ad7725a5a89f3e421de007d1525 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Mon, 13 May 2019 22:05:00 +0300 Subject: [PATCH] fix warnings and lints --- melib/src/lib.rs | 1 + melib/src/mailbox/email/parser.rs | 2 + ui/Cargo.toml | 2 +- ui/src/components/mail/listing.rs | 9 ++- ui/src/components/mail/listing/compact.rs | 18 ++--- ui/src/components/mail/listing/thread.rs | 6 +- ui/src/components/mail/view/html.rs | 53 ++++++------- ui/src/components/mail/view/thread.rs | 90 ++++++++++------------- ui/src/components/notifications.rs | 4 +- ui/src/components/utilities.rs | 7 +- ui/src/components/utilities/widgets.rs | 2 +- ui/src/conf.rs | 8 +- ui/src/conf/accounts.rs | 39 +++++----- ui/src/terminal/cells.rs | 2 +- ui/src/terminal/grapheme_clusters.rs | 8 +- ui/src/terminal/keys.rs | 2 +- ui/src/workers.rs | 2 +- 17 files changed, 118 insertions(+), 137 deletions(-) diff --git a/melib/src/lib.rs b/melib/src/lib.rs index 72e36b77..64375e94 100644 --- a/melib/src/lib.rs +++ b/melib/src/lib.rs @@ -20,6 +20,7 @@ */ #[macro_use] pub mod dbg { + #[allow(clippy::redundant_closure)] #[macro_export] macro_rules! debug { ($val:literal) => { diff --git a/melib/src/mailbox/email/parser.rs b/melib/src/mailbox/email/parser.rs index a75b16fc..4b28339a 100644 --- a/melib/src/mailbox/email/parser.rs +++ b/melib/src/mailbox/email/parser.rs @@ -821,6 +821,7 @@ mod tests { let mut buffer: Vec = Vec::new(); //FIXME: add file return; + /* let _ = std::fs::File::open("").unwrap().read_to_end(&mut buffer); let boundary = b"b1_4382d284f0c601a737bb32aaeda53160"; let (_, body) = match mail(&buffer).to_full_result() { @@ -834,6 +835,7 @@ mod tests { .map(|v| std::str::from_utf8(v).unwrap()) .collect(); println!("attachments {:?}", v); + */ } #[test] fn test_addresses() { diff --git a/ui/Cargo.toml b/ui/Cargo.toml index 994ef800..7520f51f 100644 --- a/ui/Cargo.toml +++ b/ui/Cargo.toml @@ -9,7 +9,7 @@ xdg = "2.1.0" # >:c serde = "1.0.71" serde_derive = "1.0.71" serde_json = "1.0" -config = "0.6" +config = { path = "../../config-rs", version = "*" } chan = "0.1.21" chan-signal = "0.3.1" fnv = "1.0.3" # >:c diff --git a/ui/src/components/mail/listing.rs b/ui/src/components/mail/listing.rs index 52568b87..3522f275 100644 --- a/ui/src/components/mail/listing.rs +++ b/ui/src/components/mail/listing.rs @@ -104,9 +104,10 @@ impl Component for Listing { let bottom_right = bottom_right!(area); let total_cols = get_x(bottom_right) - get_x(upper_left); - let right_component_width = match self.menu_visibility { - true => (self.ratio * total_cols) / 100, - false => total_cols, + let right_component_width = if self.menu_visibility { + (self.ratio * total_cols) / 100 + } else { + total_cols }; let mid = get_x(bottom_right) - right_component_width; if self.dirty && mid != get_x(upper_left) { @@ -568,7 +569,7 @@ impl Listing { (Color::Default, Color::Default) }; - let (x, _) = write_string_to_grid( + write_string_to_grid( &s, grid, color_fg, diff --git a/ui/src/components/mail/listing/compact.rs b/ui/src/components/mail/listing/compact.rs index f7688ccb..53d7ceff 100644 --- a/ui/src/components/mail/listing/compact.rs +++ b/ui/src/components/mail/listing/compact.rs @@ -92,7 +92,7 @@ column_str!(struct SubjectString(String)); impl fmt::Display for MailboxView { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "") + write!(f, "{}", MailboxView::DESCRIPTION) } } @@ -237,11 +237,9 @@ impl MailboxView { self.order.insert(i, idx); } let widths: (usize, usize, usize); - let column_sep: usize; - - if MAX_COLS >= min_width.0 + min_width.1 + min_width.2 { + let column_sep: usize = if MAX_COLS >= min_width.0 + min_width.1 + min_width.2 { widths = min_width; - column_sep = 2; + 2 } else { let width = MAX_COLS - 3 - min_width.0; widths = ( @@ -249,8 +247,8 @@ impl MailboxView { cmp::min(min_width.1, width / 3), cmp::min(min_width.2, width / 3), ); - column_sep = 1; - } + 1 + }; for ((idx, root_idx), strings) in threads.root_iter().enumerate().zip(rows) { let thread_node = &threads.thread_nodes()[root_idx]; @@ -738,8 +736,10 @@ impl ListingTrait for CompactListing { (self.cursor, self.views[self.cursor].cursor_pos.1, None) } fn set_coordinates(&mut self, coordinates: (usize, usize, Option)) { - self.views[self.cursor].new_cursor_pos = (coordinates.0, coordinates.1, 0); - self.views[self.cursor].unfocused = false; + self.views + .get_mut(self.cursor) + .map(|v| v.new_cursor_pos = (coordinates.0, coordinates.1, 0)); + self.views.get_mut(self.cursor).map(|v| v.unfocused = false); } } diff --git a/ui/src/components/mail/listing/thread.rs b/ui/src/components/mail/listing/thread.rs index 65a51bac..6bc19484 100644 --- a/ui/src/components/mail/listing/thread.rs +++ b/ui/src/components/mail/listing/thread.rs @@ -184,9 +184,7 @@ impl ThreadListing { i, threads, &indentations, - self.length, has_sibling, - // context.accounts[self.cursor_pos.0].backend.operation(envelope.hash()) ), &mut self.content, fg_color, @@ -194,6 +192,7 @@ impl ThreadListing { ((0, idx), (MAX_COLS - 1, idx)), false, ); + for x in x..MAX_COLS { self.content[(x, idx)].set_ch(' '); self.content[(x, idx)].set_bg(bg_color); @@ -205,7 +204,7 @@ impl ThreadListing { match iter.peek() { Some((x, _, _)) if *x > indentation => { - if debug!(has_sibling) { + if has_sibling { indentations.push(true); } else { indentations.push(false); @@ -366,7 +365,6 @@ impl ThreadListing { node_idx: usize, threads: &Threads, indentations: &[bool], - idx_width: usize, has_sibling: bool, //op: Box, ) -> String { diff --git a/ui/src/components/mail/view/html.rs b/ui/src/components/mail/view/html.rs index 60e5b34c..0c89db9e 100644 --- a/ui/src/components/mail/view/html.rs +++ b/ui/src/components/mail/view/html.rs @@ -70,36 +70,31 @@ impl HtmlView { )); display_text } - } else { - if let Ok(mut html_filter) = Command::new("w3m") - .args(&["-I", "utf-8", "-T", "text/html"]) - .stdin(Stdio::piped()) - .stdout(Stdio::piped()) - .spawn() - { - html_filter - .stdin - .as_mut() - .unwrap() - .write_all(&bytes) - .expect("Failed to write to html filter stdin"); - let mut display_text = String::from( - "Text piped through `w3m`. Press `v` to open in web browser. \n\n", - ); - display_text.push_str(&String::from_utf8_lossy( - &html_filter.wait_with_output().unwrap().stdout, - )); + } else if let Ok(mut html_filter) = Command::new("w3m") + .args(&["-I", "utf-8", "-T", "text/html"]) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn() + { + html_filter + .stdin + .as_mut() + .unwrap() + .write_all(&bytes) + .expect("Failed to write to html filter stdin"); + let mut display_text = + String::from("Text piped through `w3m`. Press `v` to open in web browser. \n\n"); + display_text.push_str(&String::from_utf8_lossy( + &html_filter.wait_with_output().unwrap().stdout, + )); - display_text - } else { - context.replies.push_back(UIEvent::Notification( - Some(format!( - "Failed to find any application to use as html filter" - )), - String::new(), - )); - String::from_utf8_lossy(&bytes).to_string() - } + display_text + } else { + context.replies.push_back(UIEvent::Notification( + Some("Failed to find any application to use as html filter".to_string()), + String::new(), + )); + String::from_utf8_lossy(&bytes).to_string() }; if body.count_attachments() > 1 { display_text = diff --git a/ui/src/components/mail/view/thread.rs b/ui/src/components/mail/view/thread.rs index d478579d..31ab4abd 100644 --- a/ui/src/components/mail/view/thread.rs +++ b/ui/src/components/mail/view/thread.rs @@ -21,7 +21,6 @@ use super::*; use std::cmp; -use std::ops::Index; #[derive(Debug, Clone)] struct ThreadEntry { @@ -299,7 +298,7 @@ impl ThreadView { ), false, ); - if let Some(len) = highlight_reply_subjects[y] { + if let Some(_len) = highlight_reply_subjects[y] { let index = e.index.0 * 4 + 1; let area = ((index, 2 * y), (width - 2, 2 * y)); let fg_color = Color::Byte(33); @@ -395,12 +394,11 @@ impl ThreadView { .iter() .flat_map(|ref v| v.iter()) .collect(); - if (rows >= visibles.len()) { + if rows >= visibles.len() { upper_left = pos_dec(upper_left!(area), (1, 0)); } - let mut visible_entry_counter = 0; - for v in visibles.iter().skip(top_idx).take(rows) { + for (visible_entry_counter, v) in visibles.iter().skip(top_idx).take(rows).enumerate() { if visible_entry_counter >= rows { break; } @@ -417,7 +415,6 @@ impl ThreadView { (width - 1, 2 * idx + 1), ), ); - visible_entry_counter += 1; } /* If cursor position has changed, remove the highlight from the previous position and * apply it in the new one. */ @@ -449,7 +446,7 @@ impl ThreadView { ); self.highlight_line(grid, dest_area, src_area, idx); - if (rows < visibles.len()) { + if rows < visibles.len() { ScrollBar::draw( grid, ( @@ -473,7 +470,7 @@ impl ThreadView { .iter() .flat_map(|ref v| v.iter()) .collect(); - if (rows >= visibles.len()) { + if rows >= visibles.len() { upper_left = pos_dec(upper_left!(area), (1, 0)); } for &idx in &[old_cursor_pos, self.cursor_pos] { @@ -501,7 +498,7 @@ impl ThreadView { ); self.highlight_line(grid, dest_area, src_area, entry_idx); - if (rows < visibles.len()) { + if rows < visibles.len() { ScrollBar::draw( grid, ( @@ -534,45 +531,41 @@ impl ThreadView { /* First draw the thread subject on the first row */ let y = if self.dirty { - let y = { - let mailbox = &mut context.accounts[self.coordinates.0][self.coordinates.1] - .as_ref() - .unwrap(); - let threads = &mailbox.collection.threads; - let thread_node = &threads.thread_nodes()[threads.root_set(self.coordinates.2)]; - let i = if let Some(i) = thread_node.message() { - i - } else { - threads.thread_nodes()[thread_node.children()[0]] - .message() - .unwrap() - }; - let envelope: &Envelope = &mailbox.collection[&i]; - - let (x, y) = write_string_to_grid( - &envelope.subject(), - grid, - Color::Byte(33), - Color::Default, - area, - true, - ); - for x in x..=get_x(bottom_right) { - grid[(x, y)].set_ch(' '); - grid[(x, y)].set_bg(Color::Default); - grid[(x, y)].set_fg(Color::Default); - } - context - .dirty_areas - .push_back((upper_left, set_y(bottom_right, y + 1))); - context - .dirty_areas - .push_back(((mid, y + 1), set_x(bottom_right, mid))); - clear_area(grid, ((mid, y + 1), set_x(bottom_right, mid))); - y + 2 + let mailbox = &mut context.accounts[self.coordinates.0][self.coordinates.1] + .as_ref() + .unwrap(); + let threads = &mailbox.collection.threads; + let thread_node = &threads.thread_nodes()[threads.root_set(self.coordinates.2)]; + let i = if let Some(i) = thread_node.message() { + i + } else { + threads.thread_nodes()[thread_node.children()[0]] + .message() + .unwrap() }; - //clear_area(grid, (set_y(upper_left, y), set_x(bottom_right, mid))); - y + let envelope: &Envelope = &mailbox.collection[&i]; + + let (x, y) = write_string_to_grid( + &envelope.subject(), + grid, + Color::Byte(33), + Color::Default, + area, + true, + ); + for x in x..=get_x(bottom_right) { + grid[(x, y)].set_ch(' '); + grid[(x, y)].set_bg(Color::Default); + grid[(x, y)].set_fg(Color::Default); + } + context + .dirty_areas + .push_back((upper_left, set_y(bottom_right, y + 1))); + context + .dirty_areas + .push_back(((mid, y + 1), set_x(bottom_right, mid))); + clear_area(grid, ((mid, y + 1), set_x(bottom_right, mid))); + y + 2 } else { get_y(upper_left) + 2 }; @@ -716,9 +709,6 @@ impl ThreadView { } } - fn visible_entries(&self) -> Vec> { - self.visible_entries.clone() - } fn recalc_visible_entries(&mut self) { if self .entries diff --git a/ui/src/components/notifications.rs b/ui/src/components/notifications.rs index c397f181..1ac986a0 100644 --- a/ui/src/components/notifications.rs +++ b/ui/src/components/notifications.rs @@ -45,7 +45,7 @@ impl Component for XDGNotifications { notify_Notification::new() .appname("meli") .icon("mail-message-new") - .summary(title.as_ref().map(|v| v.as_str()).unwrap_or("Event")) + .summary(title.as_ref().map(String::as_str).unwrap_or("Event")) .body(&escape_str(body)) .icon("dialog-information") .show() @@ -124,7 +124,7 @@ impl Component for NotificationFilter { if let UIEvent::Notification(ref title, ref body) = event { if let Some(ref bin) = context.runtime_settings.notifications.script { if let Err(v) = Command::new(bin) - .arg(title.as_ref().map(|v| v.as_str()).unwrap_or("Event")) + .arg(title.as_ref().map(String::as_str).unwrap_or("Event")) .arg(body) .stdin(Stdio::piped()) .stdout(Stdio::piped()) diff --git a/ui/src/components/utilities.rs b/ui/src/components/utilities.rs index 37f58a03..31770cba 100644 --- a/ui/src/components/utilities.rs +++ b/ui/src/components/utilities.rs @@ -187,7 +187,7 @@ impl Component for VSplit { if get_y(upper_left) > 1 { let c = grid .get(mid, get_y(upper_left) - 1) - .map(|a| a.ch()) + .map(Cell::ch) .unwrap_or_else(|| ' '); if let HORZ_BOUNDARY = c { grid[(mid, get_y(upper_left) - 1)].set_ch(LIGHT_DOWN_AND_HORIZONTAL); @@ -203,7 +203,7 @@ impl Component for VSplit { if get_y(bottom_right) > 1 { let c = grid .get(mid, get_y(bottom_right) - 1) - .map(|a| a.ch()) + .map(Cell::ch) .unwrap_or_else(|| ' '); if let HORZ_BOUNDARY = c { grid[(mid, get_y(bottom_right) + 1)].set_ch(LIGHT_UP_AND_HORIZONTAL); @@ -475,7 +475,7 @@ impl Component for Pager { if self.cursor_pos + height >= self.height { self.cursor_pos = self.height.saturating_sub(height); }; - let pos = copy_area_with_break( + copy_area_with_break( grid, &self.content, area, @@ -872,7 +872,6 @@ impl Tabbed { } fn draw_tabs(&mut self, grid: &mut CellBuffer, area: Area, context: &mut Context) { let upper_left = upper_left!(area); - let bottom_right = bottom_right!(area); if self.children.is_empty() { clear_area(grid, area); diff --git a/ui/src/components/utilities/widgets.rs b/ui/src/components/utilities/widgets.rs index 13414bdb..a2be3e16 100644 --- a/ui/src/components/utilities/widgets.rs +++ b/ui/src/components/utilities/widgets.rs @@ -645,7 +645,7 @@ impl AutoComplete { } let mut content = CellBuffer::new( - entries.iter().map(|e| e.len()).max().unwrap_or(0) + 1, + entries.iter().map(String::len).max().unwrap_or(0) + 1, entries.len(), Cell::with_style(Color::Byte(23), Color::Byte(7), Attr::Default), ); diff --git a/ui/src/conf.rs b/ui/src/conf.rs index 463377f3..5fa6e23e 100644 --- a/ui/src/conf.rs +++ b/ui/src/conf.rs @@ -107,7 +107,7 @@ impl Default for FolderConf { impl FolderConf { pub fn rename(&self) -> Option<&str> { - self.rename.as_ref().map(|v| v.as_str()) + self.rename.as_ref().map(String::as_str) } } @@ -149,7 +149,7 @@ impl From for AccountConf { display_name, }; - let folder_confs = x.folders.clone().unwrap_or_else(|| Default::default()); + let folder_confs = x.folders.clone().unwrap_or_else(Default::default); AccountConf { account: acc, @@ -173,7 +173,7 @@ impl FileAccount { self.sent_folder.as_str() } pub fn html_filter(&self) -> Option<&str> { - self.html_filter.as_ref().map(|f| f.as_str()) + self.html_filter.as_ref().map(String::as_str) } } @@ -236,7 +236,7 @@ impl FileSettings { .unwrap(); /* No point in returning without a config file. */ - match s.deserialize() { + match s.try_into() { Ok(v) => Ok(v), Err(e) => Err(MeliError::new(e.to_string())), } diff --git a/ui/src/conf/accounts.rs b/ui/src/conf/accounts.rs index 8b4d9965..1a755f6f 100644 --- a/ui/src/conf/accounts.rs +++ b/ui/src/conf/accounts.rs @@ -108,21 +108,20 @@ impl<'a> Iterator for MailboxIterator<'a> { if self.pos == self.folders.len() { return None; } - for fh in self.folders_order[self.pos..].iter() { - if self.pos == self.folders.len() { - return None; - } + let fh = &self.folders_order[self.pos]; - self.pos += 1; - if self.folders[&fh].is_none() { - return Some(None); - } - if let Some(Err(_)) = self.folders[&fh] { - return Some(None); - } - return Some(Some(self.folders[&fh].as_ref().unwrap().as_ref().unwrap())); + if self.pos == self.folders.len() { + return None; } - return None; + + self.pos += 1; + if self.folders[&fh].is_none() { + return Some(None); + } + if let Some(Err(_)) = self.folders[&fh] { + return Some(None); + } + return Some(Some(self.folders[&fh].as_ref().unwrap().as_ref().unwrap())); } } @@ -155,8 +154,8 @@ impl Account { .or_default(); if (f.name().eq_ignore_ascii_case("junk") || f.name().eq_ignore_ascii_case("spam") - || f.name().eq_ignore_ascii_case("trash") - || f.name().eq_ignore_ascii_case("sent")) + || f.name().eq_ignore_ascii_case("sent") + || f.name().eq_ignore_ascii_case("trash")) && entry.ignore.is_unset() { entry.ignore = ToggleFlag::InternalVal(true); @@ -181,10 +180,6 @@ impl Account { tree.push(rec(*h, &ref_folders)); for &c in f.children() { - let k = FolderNode { - hash: c, - kids: Vec::new(), - }; stack.push(c); } while let Some(next) = stack.pop() { @@ -206,10 +201,10 @@ impl Account { for n in tree.iter_mut() { folders_order.push(n.hash); n.kids.sort_unstable_by_key(|f| ref_folders[&f.hash].name()); - stack.extend(n.kids.iter().rev().map(|r| Some(r))); + stack.extend(n.kids.iter().rev().map(Some)); while let Some(Some(next)) = stack.pop() { folders_order.push(next.hash); - stack.extend(next.kids.iter().rev().map(|r| Some(r))); + stack.extend(next.kids.iter().rev().map(Some)); } } } @@ -455,7 +450,7 @@ impl Account { pub fn save(&self, bytes: &[u8], folder: &str) -> Result<()> { self.backend.save(bytes, folder) } - pub fn iter_mailboxes<'a>(&'a self) -> MailboxIterator<'a> { + pub fn iter_mailboxes(&self) -> MailboxIterator { MailboxIterator { folders_order: &self.folders_order, folders: &self.folders, diff --git a/ui/src/terminal/cells.rs b/ui/src/terminal/cells.rs index 6075160e..666a5f57 100644 --- a/ui/src/terminal/cells.rs +++ b/ui/src/terminal/cells.rs @@ -23,7 +23,7 @@ Define a (x, y) point in the terminal display as a holder of a character, foreground/background colors and attributes. */ -use super::grapheme_clusters::*; + use super::position::*; use std::convert::From; use std::fmt; diff --git a/ui/src/terminal/grapheme_clusters.rs b/ui/src/terminal/grapheme_clusters.rs index 72fdfa6b..a7b2f148 100644 --- a/ui/src/terminal/grapheme_clusters.rs +++ b/ui/src/terminal/grapheme_clusters.rs @@ -72,22 +72,22 @@ impl<'s> Iterator for WordBreakIter<'s> { let next_idx = graphemes[next_idx].0; let ret = &self.input[..next_idx]; self.input = &self.input[next_idx..]; - return Some(ret); + Some(ret) } else { let ret = &self.input[..self.width]; self.input = &self.input[self.width..]; - return Some(ret); + Some(ret) } } else { /* graphemes.len() < width */ let ret = self.input; self.input = &self.input[0..0]; - return Some(ret); + Some(ret) } } } -pub fn word_break_string(mut s: &str, width: usize) -> Vec<&str> { +pub fn word_break_string(s: &str, width: usize) -> Vec<&str> { let iter = WordBreakIter { input: s, width }; iter.collect() } diff --git a/ui/src/terminal/keys.rs b/ui/src/terminal/keys.rs index a85855dd..c7e8e420 100644 --- a/ui/src/terminal/keys.rs +++ b/ui/src/terminal/keys.rs @@ -27,7 +27,7 @@ use termion::event::Event as TermionEvent; use termion::event::Key as TermionKey; use termion::input::TermRead; -#[derive(Debug, PartialEq, Eq, Hash, Clone)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum Key { /// Backspace. Backspace, diff --git a/ui/src/workers.rs b/ui/src/workers.rs index d048dd14..6532ed7d 100644 --- a/ui/src/workers.rs +++ b/ui/src/workers.rs @@ -1,7 +1,7 @@ use chan; use melib::async_workers::Work; use std; -use std::mem; + use std::thread; const MAX_WORKER: usize = 4;