mirror of
https://github.com/pimalaya/himalaya.git
synced 2026-06-15 20:07:57 +08:00
use std clients
This commit is contained in:
@@ -1,17 +1,13 @@
|
||||
use std::io::{Read, Write};
|
||||
|
||||
use anyhow::{bail, Result};
|
||||
use anyhow::Result;
|
||||
use clap::Parser;
|
||||
use io_imap::{rfc3501::select::*, rfc6851::r#move::*, types::mailbox::Mailbox};
|
||||
use pimalaya_toolbox::terminal::printer::{Message, Printer};
|
||||
use io_imap::types::mailbox::Mailbox;
|
||||
use pimalaya_cli::printer::{Message, Printer};
|
||||
|
||||
use crate::imap::{
|
||||
account::ImapAccount,
|
||||
mailbox::arg::{MailboxNameOptionalFlag, MailboxNoSelectFlag, TargetMailboxNameArg},
|
||||
};
|
||||
|
||||
const READ_BUFFER_SIZE: usize = 16 * 1024;
|
||||
|
||||
/// Move message(s) to the given mailbox.
|
||||
///
|
||||
/// This command moves messages identified by the given sequence set
|
||||
@@ -37,52 +33,17 @@ pub struct ImapMessageMoveCommand {
|
||||
|
||||
impl ImapMessageMoveCommand {
|
||||
pub fn execute(self, printer: &mut impl Printer, account: ImapAccount) -> Result<()> {
|
||||
let mut imap = account.new_imap_session()?;
|
||||
let mut client = account.new_imap_client()?;
|
||||
let mailbox = self.mailbox_name.inner.try_into()?;
|
||||
|
||||
let mut buf = [0u8; READ_BUFFER_SIZE];
|
||||
|
||||
if !self.mailbox_no_select.inner {
|
||||
let mut coroutine = ImapMailboxSelect::new(imap.context, mailbox);
|
||||
let mut arg: Option<&[u8]> = None;
|
||||
|
||||
imap.context = loop {
|
||||
match coroutine.resume(arg.take()) {
|
||||
ImapMailboxSelectResult::Ok { context, .. } => break context,
|
||||
ImapMailboxSelectResult::WantsRead => {
|
||||
let n = imap.stream.read(&mut buf)?;
|
||||
arg = Some(&buf[..n]);
|
||||
}
|
||||
ImapMailboxSelectResult::WantsWrite(bytes) => {
|
||||
imap.stream.write_all(&bytes)?;
|
||||
arg = None;
|
||||
}
|
||||
ImapMailboxSelectResult::Err { err, .. } => bail!("{err}"),
|
||||
}
|
||||
};
|
||||
client.select(mailbox)?;
|
||||
}
|
||||
|
||||
let sequence_set = self.sequence_set.as_str().try_into()?;
|
||||
let destination: Mailbox<'static> = self.mailbox_dest_name.inner.try_into()?;
|
||||
|
||||
let mut coroutine =
|
||||
ImapMessageMove::new(imap.context, sequence_set, destination, !self.seq);
|
||||
let mut arg: Option<&[u8]> = None;
|
||||
|
||||
loop {
|
||||
match coroutine.resume(arg.take()) {
|
||||
ImapMessageMoveResult::Ok { .. } => break,
|
||||
ImapMessageMoveResult::WantsRead => {
|
||||
let n = imap.stream.read(&mut buf)?;
|
||||
arg = Some(&buf[..n]);
|
||||
}
|
||||
ImapMessageMoveResult::WantsWrite(bytes) => {
|
||||
imap.stream.write_all(&bytes)?;
|
||||
arg = None;
|
||||
}
|
||||
ImapMessageMoveResult::Err { err, .. } => bail!("{err}"),
|
||||
}
|
||||
}
|
||||
client.r#move(sequence_set, destination, !self.seq)?;
|
||||
|
||||
printer.out(Message::new("Message(s) successfully moved"))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user