diff --git a/src/imap/envelope/list.rs b/src/imap/envelope/list.rs index 5717355b..a0173153 100644 --- a/src/imap/envelope/list.rs +++ b/src/imap/envelope/list.rs @@ -182,8 +182,10 @@ fn map_envelopes_table_entries( let mut entries: Vec = data .into_iter() .map(|(seq, items)| { - let mut entry = EnvelopesTableEntry::default(); - entry.seq = seq.get(); + let mut entry = EnvelopesTableEntry { + seq: seq.get(), + ..Default::default() + }; for item in items.into_iter() { match item { diff --git a/src/imap/envelope/thread.rs b/src/imap/envelope/thread.rs index aae8cb4f..519acffc 100644 --- a/src/imap/envelope/thread.rs +++ b/src/imap/envelope/thread.rs @@ -154,10 +154,8 @@ fn fetch_subjects( for item in items.into_iter() { match item { - MessageDataItem::Uid(uid_val) => { - if uid { - id = uid_val.get(); - } + MessageDataItem::Uid(uid_val) if uid => { + id = uid_val.get(); } MessageDataItem::Envelope(env) => { // NString wraps Option, access via .0 diff --git a/src/jmap/mailbox/create.rs b/src/jmap/mailbox/create.rs index 61acac7b..1e457c4e 100644 --- a/src/jmap/mailbox/create.rs +++ b/src/jmap/mailbox/create.rs @@ -53,8 +53,10 @@ impl JmapMailboxCreateCommand { let mut create = BTreeMap::new(); create.insert(self.name.clone(), new_mailbox); - let mut args = JmapMailboxSetArgs::default(); - args.create = Some(create); + let args = JmapMailboxSetArgs { + create: Some(create), + ..Default::default() + }; let output = client.mailbox_set(args)?; diff --git a/src/jmap/mailbox/destroy.rs b/src/jmap/mailbox/destroy.rs index ef07482e..9097e163 100644 --- a/src/jmap/mailbox/destroy.rs +++ b/src/jmap/mailbox/destroy.rs @@ -36,9 +36,11 @@ pub struct JmapMailboxDestroyCommand { impl JmapMailboxDestroyCommand { pub fn execute(self, printer: &mut impl Printer, mut client: JmapClient) -> Result<()> { - let mut args = JmapMailboxSetArgs::default(); - args.destroy = Some(self.ids.clone()); - args.on_destroy_remove_emails = if self.purge { Some(true) } else { None }; + let args = JmapMailboxSetArgs { + destroy: Some(self.ids.clone()), + on_destroy_remove_emails: if self.purge { Some(true) } else { None }, + ..Default::default() + }; let output = client.mailbox_set(args)?; diff --git a/src/jmap/mailbox/update.rs b/src/jmap/mailbox/update.rs index 6ef8d2c8..d75d84d4 100644 --- a/src/jmap/mailbox/update.rs +++ b/src/jmap/mailbox/update.rs @@ -77,8 +77,10 @@ impl JmapMailboxUpdateCommand { let mut update = BTreeMap::new(); update.insert(self.id.clone(), patch); - let mut args = JmapMailboxSetArgs::default(); - args.update = Some(update); + let args = JmapMailboxSetArgs { + update: Some(update), + ..Default::default() + }; let output = client.mailbox_set(args)?; diff --git a/src/maildir/envelope/list.rs b/src/maildir/envelope/list.rs index 89af66fe..8a642737 100644 --- a/src/maildir/envelope/list.rs +++ b/src/maildir/envelope/list.rs @@ -54,18 +54,20 @@ impl MaildirEnvelopeListCommand { continue; }; - let mut row = EnvelopesTableEntry::default(); - - row.id = id; - row.subject = parsed.subject().unwrap_or("").to_owned(); - - if let Some(addr) = parsed.from().and_then(|a| a.first()) { - row.from = addr.name().or(addr.address()).unwrap_or("").to_owned(); - } - - if let Some(date) = parsed.date() { - row.date = date.to_rfc822(); - } + let row = EnvelopesTableEntry { + id, + subject: parsed.subject().unwrap_or("").to_owned(), + from: parsed + .from() + .and_then(|a| a.first()) + .and_then(|addr| addr.name().or(addr.address())) + .map(str::to_owned) + .unwrap_or_default(), + date: parsed + .date() + .map(|date| date.to_rfc822()) + .unwrap_or_default(), + }; envelopes.push(row); } diff --git a/src/shared/messages/builder.rs b/src/shared/messages/builder.rs index 778729b7..71e5791b 100644 --- a/src/shared/messages/builder.rs +++ b/src/shared/messages/builder.rs @@ -378,7 +378,7 @@ fn mime_for(path: &Path) -> &'static str { { let guess = mime_guess::from_path(path).first_or_octet_stream(); let s = guess.essence_str().to_string(); - return Box::leak(s.into_boxed_str()); + Box::leak(s.into_boxed_str()) } #[cfg(not(feature = "maildir"))] { diff --git a/src/shared/messages/output.rs b/src/shared/messages/output.rs index 96963040..a02f4da0 100644 --- a/src/shared/messages/output.rs +++ b/src/shared/messages/output.rs @@ -71,10 +71,8 @@ pub fn extract_envelope(raw: &[u8]) -> Result<(String, Vec)> { .ok_or_else(|| anyhow!("failed to parse outgoing message"))?; let mut from_emails = Vec::new(); - if let Some(header) = parsed.header("From").cloned() { - if let HeaderValue::Address(addr) = header { - collect_emails(addr, &mut from_emails); - } + if let Some(HeaderValue::Address(addr)) = parsed.header("From").cloned() { + collect_emails(addr, &mut from_emails); } let from = from_emails .into_iter() @@ -83,10 +81,8 @@ pub fn extract_envelope(raw: &[u8]) -> Result<(String, Vec)> { let mut to = Vec::new(); for name in ["To", "Cc", "Bcc"] { - if let Some(header) = parsed.header(name).cloned() { - if let HeaderValue::Address(addr) = header { - collect_emails(addr, &mut to); - } + if let Some(HeaderValue::Address(addr)) = parsed.header(name).cloned() { + collect_emails(addr, &mut to); } } diff --git a/src/wizard/autoconfig.rs b/src/wizard/autoconfig.rs index c3944fe4..b249d885 100644 --- a/src/wizard/autoconfig.rs +++ b/src/wizard/autoconfig.rs @@ -21,7 +21,7 @@ //! spinner. use io_discovery::autoconfig::{ - client::DiscoveryAutoconfigClientStd, + client::{DiscoveryAutoconfigClientStd, DiscoveryAutoconfigClientStdError}, types::{Autoconfig, SecurityType, Server, ServerType}, }; use log::debug; @@ -35,31 +35,43 @@ use pimalaya_cli::{ use crate::wizard::discover::{DiscoveryResult, discovery_resolver, discovery_tls}; +struct Attempt<'a> { + label: &'a str, + run: &'a dyn Fn( + &mut DiscoveryAutoconfigClientStd, + ) -> Result, +} + pub fn run(local_part: &str, domain: &str) -> Option { let mut client = DiscoveryAutoconfigClientStd::new(discovery_resolver()).with_tls(discovery_tls()); - let attempts: [(&str, &dyn Fn(&mut DiscoveryAutoconfigClientStd) -> _); 3] = [ - ("Autoconfig ISP main URL", &|c| { - c.isp(local_part, domain, true) - }), - ("Autoconfig ISP fallback URL", &|c| { - c.isp_fallback(domain, true) - }), - ("Thunderbird ISPDB", &|c| c.ispdb(domain, true)), + let attempts = [ + Attempt { + label: "Autoconfig ISP main URL", + run: &|c| c.isp(local_part, domain, true), + }, + Attempt { + label: "Autoconfig ISP fallback URL", + run: &|c| c.isp_fallback(domain, true), + }, + Attempt { + label: "Thunderbird ISPDB", + run: &|c| c.ispdb(domain, true), + }, ]; - for (label, run) in attempts { - let spinner = Spinner::start(format!("Probing {label} for {domain}…")); + for attempt in attempts { + let spinner = Spinner::start(format!("Probing {} for {domain}…", attempt.label)); - match run(&mut client) { + match (attempt.run)(&mut client) { Ok(config) => { spinner.success(summary(domain, &config)); return Some(config); } Err(err) => { - debug!("{label} for {domain} failed: {err}"); - spinner.failure(format!("{label}: not available for {domain}")); + debug!("{} for {domain} failed: {err}", attempt.label); + spinner.failure(format!("{}: not available for {domain}", attempt.label)); } } }