mirror of
https://github.com/pimalaya/himalaya.git
synced 2026-06-15 11:27:53 +08:00
@@ -182,8 +182,10 @@ fn map_envelopes_table_entries(
|
||||
let mut entries: Vec<EnvelopesTableEntry> = 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 {
|
||||
|
||||
@@ -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<IString>, access via .0
|
||||
|
||||
@@ -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)?;
|
||||
|
||||
|
||||
@@ -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)?;
|
||||
|
||||
|
||||
@@ -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)?;
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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"))]
|
||||
{
|
||||
|
||||
@@ -71,10 +71,8 @@ pub fn extract_envelope(raw: &[u8]) -> Result<(String, Vec<String>)> {
|
||||
.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<String>)> {
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+26
-14
@@ -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<Autoconfig, DiscoveryAutoconfigClientStdError>,
|
||||
}
|
||||
|
||||
pub fn run(local_part: &str, domain: &str) -> Option<Autoconfig> {
|
||||
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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user