use nom::branch::alt;
use nom::bytes::complete::{tag, tag_no_case, take, take_while, take_while1};
use nom::character::complete::{char, digit1};
use nom::combinator::{eof, map, opt, peek, value, verify};
use nom::multi::{many0, separated_list0, separated_list1};
use nom::sequence::{delimited, preceded, terminated, tuple};
use nom::IResult;
use crate::types::body::{BodyStructure, ContentDisposition};
use crate::types::envelope::{Envelope, EnvelopeAddress};
use crate::types::fetch::{BinarySection, BodySection, FetchResponse};
use crate::types::flag::Flag;
use crate::types::mailbox::{MailboxAttribute, MailboxInfo, StatusItem};
use crate::types::response::{
AclEntry, Capability, ContinuationRequest, EsearchResponse, GreetingResponse, GreetingStatus,
MetadataEntry, NamespaceDescriptor, QuotaResource, Response, ResponseCode, StatusKind,
TaggedResponse, ThreadNode, UidRange, UntaggedResponse, UntaggedStatus,
};
use crate::types::validated::MailboxName;
mod bodystructure;
mod encoded_words;
mod envelope_fetch;
mod extensions;
mod flags_caps;
mod mailbox;
mod primitives;
mod response;
#[cfg(test)]
#[path = "tests.rs"]
mod tests;
pub(crate) use encoded_words::decode_rfc2047;
#[allow(unused_imports)]
pub(super) use bodystructure::*;
#[allow(unused_imports)]
pub(super) use encoded_words::*;
#[allow(unused_imports)]
pub(super) use envelope_fetch::*;
#[allow(unused_imports)]
pub(super) use extensions::*;
#[allow(unused_imports)]
pub(super) use flags_caps::*;
#[allow(unused_imports)]
pub(super) use mailbox::*;
#[allow(unused_imports)]
pub(super) use primitives::*;
#[allow(unused_imports)]
pub(super) use response::*;
#[cfg(test)]
pub(crate) fn parse_response(input: &[u8]) -> IResult<&[u8], Response> {
parse_response_utf8(input, false)
}
pub(crate) fn parse_response_utf8(input: &[u8], utf8_mode: bool) -> IResult<&[u8], Response> {
alt((
map(response::parse_continuation, Response::Continuation),
map(
|i| response::parse_untagged(i, utf8_mode),
|u| Response::Untagged(Box::new(u)),
),
map(response::parse_tagged, Response::Tagged),
))(input)
}
pub(crate) fn parse_greeting(input: &[u8]) -> IResult<&[u8], Response> {
let (input, _) = tag(b"* ")(input)?;
let (input, status) = alt((
value(GreetingStatus::Ok, tag_no_case(b"OK")),
value(GreetingStatus::PreAuth, tag_no_case(b"PREAUTH")),
value(GreetingStatus::Bye, tag_no_case(b"BYE")),
))(input)?;
let (input, maybe_sp) = opt(primitives::sp)(input)?;
if maybe_sp.is_some() {
let (input, (code, text)) = flags_caps::resp_text(input)?;
let (input, _) = primitives::crlf(input)?;
Ok((
input,
Response::Greeting(GreetingResponse { status, code, text }),
))
} else {
let (input, _) = primitives::crlf(input)?;
Ok((
input,
Response::Greeting(GreetingResponse {
status,
code: None,
text: String::new(),
}),
))
}
}