use serde::{Deserialize, Serialize};
use super::{command::Commands, errors::SMTPError};
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
pub struct ClientMessage<T> {
pub command: Commands,
pub data: T,
}
impl<T> ClientMessage<T> {
pub fn from_bytes<'a>(bytes: Vec<u8>) -> Result<ClientMessage<T>, SMTPError<'a>>
where
T: std::iter::FromIterator<String>,
{
let message = match String::from_utf8(bytes.to_vec()) {
Ok(cmd) => cmd,
Err(_) => return Err(SMTPError::ParseError("Cannot convert to String from bytes")),
};
let mut parts = message.split(" ");
let cmd = match parts.next() {
Some(cmd) => cmd.to_string(),
None => {
return Err(SMTPError::ParseError(
"Invalid Message, Message doesn't contain COMMAND",
))
}
};
let data = parts.skip(1).map(|s| s.to_string()).collect();
let command = Commands::from_bytes(cmd.as_bytes());
Ok(ClientMessage { command, data })
}
}