From b3bec8656dbae299336277bda1090b0d880f71e2 Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Wed, 19 Jul 2023 19:30:07 +0200 Subject: [PATCH] mime part of rfc5322 --- src/rfc5322/mime.rs | 36 ++++++++++++++++++++++++++++++++++++ src/rfc5322/mod.rs | 1 + 2 files changed, 37 insertions(+) create mode 100644 src/rfc5322/mime.rs diff --git a/src/rfc5322/mime.rs b/src/rfc5322/mime.rs new file mode 100644 index 0000000..bde8a7c --- /dev/null +++ b/src/rfc5322/mime.rs @@ -0,0 +1,36 @@ +use nom::{ + IResult, + sequence::tuple, + bytes::complete::{tag, take}, + combinator::{map, opt, verify}, +}; + +use crate::text::ascii; +use crate::text::whitespace::cfws; + +#[derive(Debug, PartialEq)] +pub struct Version { + pub major: u8, + pub minor: u8, +} + +pub fn version(input: &[u8]) -> IResult<&[u8], Version> { + let (rest, (_, major, _, _, _, minor, _)) = tuple(( + opt(cfws), + map(verify(take(1usize), is_digit), ascii_to_u8), + opt(cfws), + tag(b"."), + opt(cfws), + map(verify(take(1usize), is_digit), ascii_to_u8), + opt(cfws), + ))(input)?; + Ok((rest, Version { major, minor })) +} + +fn is_digit(c: &[u8]) -> bool { + c[0] >= ascii::N0 && c[0] <= ascii::N9 +} + +fn ascii_to_u8(c: &[u8]) -> u8 { + c[0] - ascii::N0 +} diff --git a/src/rfc5322/mod.rs b/src/rfc5322/mod.rs index e3dca7f..b356bb3 100644 --- a/src/rfc5322/mod.rs +++ b/src/rfc5322/mod.rs @@ -3,3 +3,4 @@ pub mod address; pub mod datetime; pub mod trace; pub mod identification; +pub mod mime;