use alloc::{
borrow::{Cow, ToOwned},
string::String,
};
use core::num::ParseIntError;
use thiserror::Error;
pub const SIZE: &str = "SIZE";
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SmtpSizeCapability(pub u64);
#[derive(Debug, Error)]
pub enum SmtpSizeCapabilityError {
#[error("Invalid capability: expected SIZE, got {0}")]
InvalidKey(Cow<'static, str>),
#[error("Invalid capabliity SIZE value `{1}`")]
InvalidValue(#[source] ParseIntError, String),
}
impl SmtpSizeCapability {
pub fn parse(s: &str) -> Result<Self, SmtpSizeCapabilityError> {
let mut parts = s.split_ascii_whitespace();
match parts.next() {
Some(key) if key.eq_ignore_ascii_case(SIZE) => {}
Some(key) => return Err(SmtpSizeCapabilityError::InvalidKey(key.to_owned().into())),
None => return Err(SmtpSizeCapabilityError::InvalidKey("nothing".into())),
}
let size = parts.next().unwrap_or("0");
return match size.parse::<u64>() {
Ok(size) => Ok(Self(size)),
Err(err) => {
let size = size.to_owned().into();
Err(SmtpSizeCapabilityError::InvalidValue(err, size))
}
};
}
}