imap_client/tasks/tasks/
capability.rs1use imap_next::imap_types::{
2 command::CommandBody,
3 core::Vec1,
4 response::{Capability, Code, Data, StatusBody, StatusKind},
5};
6
7use super::TaskError;
8use crate::tasks::Task;
9
10#[derive(Clone, Debug, Default)]
11pub struct CapabilityTask {
12 output: Option<Vec1<Capability<'static>>>,
14}
15
16impl CapabilityTask {
17 pub fn new() -> Self {
18 Default::default()
19 }
20}
21
22impl Task for CapabilityTask {
23 type Output = Result<Vec1<Capability<'static>>, TaskError>;
24
25 fn command_body(&self) -> CommandBody<'static> {
26 CommandBody::Capability
27 }
28
29 fn process_data(&mut self, data: Data<'static>) -> Option<Data<'static>> {
31 if let Data::Capability(capabilities) = data {
32 self.output = Some(capabilities);
33 None
34 } else {
35 Some(data)
36 }
37 }
38
39 fn process_untagged(
42 &mut self,
43 status_body: StatusBody<'static>,
44 ) -> Option<StatusBody<'static>> {
45 if let Some(Code::Capability(capabilities)) = status_body.code {
46 self.output = Some(capabilities);
47 None
48 } else {
49 Some(status_body)
50 }
51 }
52
53 fn process_tagged(self, status_body: StatusBody<'static>) -> Self::Output {
54 match status_body.kind {
55 StatusKind::Ok => match self.output {
56 Some(capabilities) => Ok(capabilities),
57 None => {
58 if let Some(Code::Capability(capabilities)) = status_body.code {
60 Ok(capabilities)
61 } else {
62 Err(TaskError::MissingData("CAPABILITY".into()))
63 }
64 }
65 },
66 StatusKind::No => Err(TaskError::UnexpectedNoResponse(status_body)),
67 StatusKind::Bad => Err(TaskError::UnexpectedBadResponse(status_body)),
68 }
69 }
70}