use super::{Flag, Seq};
pub use imap_proto::AttributeValue;
pub use imap_proto::ResponseCode;
pub use imap_proto::StatusAttribute;
use imap_proto::{MailboxDatum, Response, Status};
#[derive(Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum UnsolicitedResponse {
Bye {
code: Option<ResponseCode<'static>>,
information: Option<String>,
},
Exists(u32),
Expunge(Seq),
Fetch {
id: u32,
attributes: Vec<AttributeValue<'static>>,
},
Flags(Vec<Flag<'static>>),
Metadata {
mailbox: String,
metadata_entries: Vec<String>,
},
Ok {
code: Option<ResponseCode<'static>>,
information: Option<String>,
},
Recent(u32),
Status {
mailbox: String,
attributes: Vec<StatusAttribute>,
},
Vanished {
earlier: bool,
uids: Vec<std::ops::RangeInclusive<u32>>,
},
}
impl<'a> TryFrom<Response<'a>> for UnsolicitedResponse {
type Error = Response<'a>;
fn try_from(response: Response<'a>) -> Result<Self, Self::Error> {
match response {
Response::Data {
status: Status::Bye,
code,
information,
} => Ok(UnsolicitedResponse::Bye {
code: code.map(|c| c.into_owned()),
information: information.map(|s| s.to_string()),
}),
Response::Data {
status: Status::Ok,
code,
information,
} => Ok(UnsolicitedResponse::Ok {
code: code.map(|c| c.into_owned()),
information: information.map(|s| s.to_string()),
}),
Response::Expunge(n) => Ok(UnsolicitedResponse::Expunge(n)),
Response::Fetch(id, attributes) => Ok(UnsolicitedResponse::Fetch {
id,
attributes: attributes.into_iter().map(|a| a.into_owned()).collect(),
}),
Response::MailboxData(MailboxDatum::Exists(n)) => Ok(UnsolicitedResponse::Exists(n)),
Response::MailboxData(MailboxDatum::Flags(flags)) => {
Ok(UnsolicitedResponse::Flags(Flag::from_strs(flags).collect()))
}
Response::MailboxData(MailboxDatum::MetadataUnsolicited { mailbox, values }) => {
Ok(UnsolicitedResponse::Metadata {
mailbox: mailbox.to_string(),
metadata_entries: values.iter().map(|s| s.to_string()).collect(),
})
}
Response::MailboxData(MailboxDatum::Recent(n)) => Ok(UnsolicitedResponse::Recent(n)),
Response::MailboxData(MailboxDatum::Status { mailbox, status }) => {
Ok(UnsolicitedResponse::Status {
mailbox: mailbox.into(),
attributes: status,
})
}
Response::Vanished { earlier, uids } => {
Ok(UnsolicitedResponse::Vanished { earlier, uids })
}
_ => Err(response),
}
}
}