1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
use crate::DataParserPeg; use samotop_core::{ common::*, mail::{Builder, MailSetup, Rfc2033}, parser::{ParseError, ParseResult, Parser}, smtp::*, }; #[derive(Clone, Copy, Debug, Default)] pub struct LmtpParserPeg; impl MailSetup for LmtpParserPeg { fn setup(self, builder: &mut Builder) { builder.command_parser.insert(0, Arc::new(self)); builder .data_parser .insert(0, Arc::new(DataParserPeg { lmtp: true })); } } impl Parser for LmtpParserPeg { fn parse_command<'i>(&self, input: &'i [u8]) -> ParseResult<'i, Box<dyn SmtpSessionCommand>> { if input.is_empty() { return Err(ParseError::Incomplete); } match crate::smtp::grammar::command(input) { Err(e) => Err(ParseError::Failed(e.into())), Ok(Err(e)) => Err(e), Ok(Ok((i, cmd))) => Ok((i, Box::new(Rfc2033::command(cmd)))), } } }