use btoi::btoi; use nom::{ branch::alt, bytes::complete::{tag, take, take_until, take_while_m_n}, character::is_digit, sequence::{terminated, tuple}, IResult, }; use crate::{ immutable::{signature::decode, Signature}, Sign, Time, }; use bstr::ByteSlice; pub(crate) const SPACE: &[u8] = b" "; pub(crate) fn signature(i: &[u8]) -> IResult<&[u8], Signature<'_>, decode::Error> { let (i, (name, email, time_in_seconds, tzsign, tzhour, tzminute)) = tuple(( terminated(take_until(&b" <"[..]), take(2usize)), terminated(take_until(&b"> "[..]), take(2usize)), terminated(take_until(SPACE), take(1usize)), alt((tag(b"-"), tag(b"+"))), take_while_m_n(2usize, 2, is_digit), take_while_m_n(2usize, 2, is_digit), ))(i) .map_err(decode::Error::context( " <>