use alloc::{borrow::Cow, vec::Vec};
use base64::{Engine, engine::general_purpose::STANDARD as base64};
use secrecy::{ExposeSecret, SecretBox};
pub struct SmtpAuthCommand<'a> {
pub mechanism: Cow<'a, str>,
pub initial_response: Option<SecretBox<[u8]>>,
}
impl<'a> From<SmtpAuthCommand<'a>> for Vec<u8> {
fn from(cmd: SmtpAuthCommand<'a>) -> Vec<u8> {
let mut buf = Vec::new();
buf.extend_from_slice(b"AUTH ");
buf.extend_from_slice(cmd.mechanism.as_bytes());
if let Some(ir) = cmd.initial_response {
let data = ir.expose_secret();
if data.is_empty() {
buf.extend_from_slice(b" =");
} else {
buf.push(b' ');
buf.extend_from_slice(base64.encode(data).as_bytes());
}
}
buf.extend_from_slice(b"\r\n");
buf
}
}