From 98c8d2ac6e83a18bf33f7cb803d266599ba58ab0 Mon Sep 17 00:00:00 2001 From: Nathan Fisher Date: Mon, 5 Jun 2023 11:10:53 -0400 Subject: [PATCH] Add `FromStr` for `Recipients` --- src/message/error.rs | 9 ++++++++- src/message/mod.rs | 18 +++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/message/error.rs b/src/message/error.rs index 20d4b7c..0097d6a 100644 --- a/src/message/error.rs +++ b/src/message/error.rs @@ -1,4 +1,4 @@ -use {crate::prelude::ParseHostError, std::fmt}; +use {crate::prelude::{ParseHostError, ParseMailboxError}, std::fmt}; #[derive(Debug, PartialEq)] /// Errors which can occur when parsing a request @@ -8,6 +8,7 @@ pub enum Error { EmptyHost, EmptyMessage, ParseHostError(ParseHostError), + ParseMailboxError(ParseMailboxError), MalformedLink, } @@ -34,3 +35,9 @@ impl From for Error { Self::ParseHostError(value) } } + +impl From for Error { + fn from(value: ParseMailboxError) -> Self { + Self::ParseMailboxError(value) + } +} diff --git a/src/message/mod.rs b/src/message/mod.rs index 4b16693..6acd3e3 100644 --- a/src/message/mod.rs +++ b/src/message/mod.rs @@ -1,4 +1,4 @@ -use crate::prelude::{Host, Mailbox}; +use crate::prelude::Mailbox; use std::{fmt, str::FromStr}; #[cfg(feature = "serde")] @@ -25,6 +25,22 @@ impl fmt::Display for Recipients { } } +impl FromStr for Recipients { + type Err = Error; + + fn from_str(s: &str) -> Result { + let mut rec = Recipients { boxes: vec![] }; + if let Some(s) = s.strip_prefix(':') { + s.split_whitespace().try_for_each(|r| { + let r = r.parse()?; + rec.boxes.push(r); + Ok::<(), Error>(()) + })?; + } + Ok(rec) + } +} + #[derive(Debug, Clone, PartialEq)] #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] pub struct Message {