Avoid duplicating unilateral response handling
This commit is contained in:
parent
b0ac079c30
commit
c0e1fbba0c
1 changed files with 42 additions and 90 deletions
132
src/parse.rs
132
src/parse.rs
|
|
@ -45,33 +45,11 @@ where
|
||||||
|
|
||||||
match map(resp)? {
|
match map(resp)? {
|
||||||
MapOrNot::Map(t) => things.push(t),
|
MapOrNot::Map(t) => things.push(t),
|
||||||
MapOrNot::Not(resp) => {
|
MapOrNot::Not(resp) => match handle_unilateral(resp, unsolicited) {
|
||||||
// check if this is simply a unilateral server response
|
Some(Response::Fetch(..)) => continue,
|
||||||
// (see Section 7 of RFC 3501):
|
Some(resp) => break Err(resp.into()),
|
||||||
match resp {
|
None => {}
|
||||||
Response::MailboxData(MailboxDatum::Recent(n)) => {
|
},
|
||||||
unsolicited.send(UnsolicitedResponse::Recent(n)).unwrap();
|
|
||||||
}
|
|
||||||
Response::MailboxData(MailboxDatum::Exists(n)) => {
|
|
||||||
unsolicited.send(UnsolicitedResponse::Exists(n)).unwrap();
|
|
||||||
}
|
|
||||||
Response::Expunge(id) => {
|
|
||||||
unsolicited.send(UnsolicitedResponse::Expunge(id)).unwrap();
|
|
||||||
}
|
|
||||||
Response::MailboxData(MailboxDatum::Status { mailbox, status }) => {
|
|
||||||
unsolicited
|
|
||||||
.send(UnsolicitedResponse::Status {
|
|
||||||
mailbox: mailbox.into(),
|
|
||||||
attributes: status,
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
Response::Fetch(..) => {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
resp => break Err(resp.into()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MapOrNot::Ignore => continue,
|
MapOrNot::Ignore => continue,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -168,27 +146,8 @@ pub fn parse_capabilities(
|
||||||
}
|
}
|
||||||
Ok((rest, data)) => {
|
Ok((rest, data)) => {
|
||||||
lines = rest;
|
lines = rest;
|
||||||
match data {
|
if let Some(resp) = handle_unilateral(data, unsolicited) {
|
||||||
Response::MailboxData(MailboxDatum::Status { mailbox, status }) => {
|
break Err(resp.into());
|
||||||
unsolicited
|
|
||||||
.send(UnsolicitedResponse::Status {
|
|
||||||
mailbox: mailbox.into(),
|
|
||||||
attributes: status,
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
Response::MailboxData(MailboxDatum::Recent(n)) => {
|
|
||||||
unsolicited.send(UnsolicitedResponse::Recent(n)).unwrap();
|
|
||||||
}
|
|
||||||
Response::MailboxData(MailboxDatum::Exists(n)) => {
|
|
||||||
unsolicited.send(UnsolicitedResponse::Exists(n)).unwrap();
|
|
||||||
}
|
|
||||||
Response::Expunge(n) => {
|
|
||||||
unsolicited.send(UnsolicitedResponse::Expunge(n)).unwrap();
|
|
||||||
}
|
|
||||||
resp => {
|
|
||||||
break Err(resp.into());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
|
@ -219,27 +178,8 @@ pub fn parse_noop(
|
||||||
match imap_proto::parse_response(lines) {
|
match imap_proto::parse_response(lines) {
|
||||||
Ok((rest, data)) => {
|
Ok((rest, data)) => {
|
||||||
lines = rest;
|
lines = rest;
|
||||||
match data {
|
if let Some(resp) = handle_unilateral(data, unsolicited) {
|
||||||
Response::MailboxData(MailboxDatum::Status { mailbox, status }) => {
|
break Err(resp.into());
|
||||||
unsolicited
|
|
||||||
.send(UnsolicitedResponse::Status {
|
|
||||||
mailbox: mailbox.into(),
|
|
||||||
attributes: status,
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
Response::MailboxData(MailboxDatum::Recent(n)) => {
|
|
||||||
unsolicited.send(UnsolicitedResponse::Recent(n)).unwrap();
|
|
||||||
}
|
|
||||||
Response::MailboxData(MailboxDatum::Exists(n)) => {
|
|
||||||
unsolicited.send(UnsolicitedResponse::Exists(n)).unwrap();
|
|
||||||
}
|
|
||||||
Response::Expunge(n) => {
|
|
||||||
unsolicited.send(UnsolicitedResponse::Expunge(n)).unwrap();
|
|
||||||
}
|
|
||||||
resp => {
|
|
||||||
break Err(resp.into());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
|
@ -348,27 +288,8 @@ pub fn parse_ids(
|
||||||
}
|
}
|
||||||
Ok((rest, data)) => {
|
Ok((rest, data)) => {
|
||||||
lines = rest;
|
lines = rest;
|
||||||
match data {
|
if let Some(resp) = handle_unilateral(data, unsolicited) {
|
||||||
Response::MailboxData(MailboxDatum::Status { mailbox, status }) => {
|
break Err(resp.into());
|
||||||
unsolicited
|
|
||||||
.send(UnsolicitedResponse::Status {
|
|
||||||
mailbox: mailbox.into(),
|
|
||||||
attributes: status,
|
|
||||||
})
|
|
||||||
.unwrap();
|
|
||||||
}
|
|
||||||
Response::MailboxData(MailboxDatum::Recent(n)) => {
|
|
||||||
unsolicited.send(UnsolicitedResponse::Recent(n)).unwrap();
|
|
||||||
}
|
|
||||||
Response::MailboxData(MailboxDatum::Exists(n)) => {
|
|
||||||
unsolicited.send(UnsolicitedResponse::Exists(n)).unwrap();
|
|
||||||
}
|
|
||||||
Response::Expunge(n) => {
|
|
||||||
unsolicited.send(UnsolicitedResponse::Expunge(n)).unwrap();
|
|
||||||
}
|
|
||||||
resp => {
|
|
||||||
break Err(resp.into());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
|
|
@ -378,6 +299,37 @@ pub fn parse_ids(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check if this is simply a unilateral server response
|
||||||
|
// (see Section 7 of RFC 3501):
|
||||||
|
fn handle_unilateral<'a>(
|
||||||
|
res: Response<'a>,
|
||||||
|
unsolicited: &mut mpsc::Sender<UnsolicitedResponse>,
|
||||||
|
) -> Option<Response<'a>> {
|
||||||
|
match res {
|
||||||
|
Response::MailboxData(MailboxDatum::Status { mailbox, status }) => {
|
||||||
|
unsolicited
|
||||||
|
.send(UnsolicitedResponse::Status {
|
||||||
|
mailbox: mailbox.into(),
|
||||||
|
attributes: status,
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
Response::MailboxData(MailboxDatum::Recent(n)) => {
|
||||||
|
unsolicited.send(UnsolicitedResponse::Recent(n)).unwrap();
|
||||||
|
}
|
||||||
|
Response::MailboxData(MailboxDatum::Exists(n)) => {
|
||||||
|
unsolicited.send(UnsolicitedResponse::Exists(n)).unwrap();
|
||||||
|
}
|
||||||
|
Response::Expunge(n) => {
|
||||||
|
unsolicited.send(UnsolicitedResponse::Expunge(n)).unwrap();
|
||||||
|
}
|
||||||
|
res => {
|
||||||
|
return Some(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue