use abnf_core::streaming::SP;
use imap_types::{address::Address, core::NString};
use nom::{
bytes::streaming::tag,
sequence::{delimited, tuple},
IResult,
};
use crate::rfc3501::core::nstring;
pub fn address(input: &[u8]) -> IResult<&[u8], Address> {
let mut parser = delimited(
tag(b"("),
tuple((addr_name, SP, addr_adl, SP, addr_mailbox, SP, addr_host)),
tag(b")"),
);
let (remaining, (name, _, adl, _, mailbox, _, host)) = parser(input)?;
Ok((
remaining,
Address {
name,
adl,
mailbox,
host,
},
))
}
#[inline]
pub fn addr_name(input: &[u8]) -> IResult<&[u8], NString> {
nstring(input)
}
#[inline]
pub fn addr_adl(input: &[u8]) -> IResult<&[u8], NString> {
nstring(input)
}
#[inline]
pub fn addr_mailbox(input: &[u8]) -> IResult<&[u8], NString> {
nstring(input)
}
#[inline]
pub fn addr_host(input: &[u8]) -> IResult<&[u8], NString> {
nstring(input)
}
#[cfg(test)]
mod test {
use std::convert::TryInto;
use imap_types::core::{IString, NString};
use super::*;
#[test]
fn test_address() {
let (rem, val) = address(b"(nil {3}\r\nxxx \"xxx\" nil)").unwrap();
assert_eq!(
val,
Address {
name: NString { inner: None },
adl: NString {
inner: Some(IString::Literal(b"xxx".as_slice().try_into().unwrap()))
},
mailbox: NString {
inner: Some(IString::Quoted("xxx".try_into().unwrap()))
},
host: NString { inner: None },
}
);
assert_eq!(rem, b"");
}
}