imap_client/tasks/tasks/
move.rs

1use imap_next::imap_types::{
2    command::CommandBody,
3    mailbox::Mailbox,
4    response::{StatusBody, StatusKind},
5    sequence::SequenceSet,
6};
7
8use super::TaskError;
9use crate::tasks::Task;
10
11pub struct MoveTask {
12    sequence_set: SequenceSet,
13    mailbox: Mailbox<'static>,
14    uid: bool,
15}
16
17impl MoveTask {
18    pub fn new(sequence_set: SequenceSet, mailbox: Mailbox<'static>) -> Self {
19        Self {
20            sequence_set,
21            mailbox,
22            uid: true,
23        }
24    }
25
26    pub fn set_uid(&mut self, uid: bool) {
27        self.uid = uid;
28    }
29
30    pub fn with_uid(mut self, uid: bool) -> Self {
31        self.set_uid(uid);
32        self
33    }
34}
35
36impl Task for MoveTask {
37    type Output = Result<(), TaskError>;
38
39    fn command_body(&self) -> CommandBody<'static> {
40        CommandBody::Move {
41            sequence_set: self.sequence_set.clone(),
42            mailbox: self.mailbox.clone(),
43            uid: self.uid,
44        }
45    }
46
47    fn process_tagged(self, status_body: StatusBody<'static>) -> Self::Output {
48        match status_body.kind {
49            StatusKind::Ok => Ok(()),
50            StatusKind::No => Err(TaskError::UnexpectedNoResponse(status_body)),
51            StatusKind::Bad => Err(TaskError::UnexpectedBadResponse(status_body)),
52        }
53    }
54}