use rusmes_proto::Mail;
pub(super) async fn serialize_message_to_bytes(mail: &Mail) -> anyhow::Result<Vec<u8>> {
let message = mail.message();
let headers = message.headers();
let body = message.body();
let mut output = Vec::new();
output.extend_from_slice(b"X-Rusmes-Message-Id: ");
output.extend_from_slice(mail.message_id().to_string().as_bytes());
output.extend_from_slice(b"\r\n");
for (name, values) in headers.iter() {
for value in values {
output.extend_from_slice(name.as_bytes());
output.extend_from_slice(b": ");
output.extend_from_slice(value.as_bytes());
output.extend_from_slice(b"\r\n");
}
}
output.extend_from_slice(b"\r\n");
match body {
rusmes_proto::MessageBody::Small(bytes) => {
output.extend_from_slice(bytes);
}
rusmes_proto::MessageBody::Large(large) => {
let data = large.read_to_bytes().await.map_err(|e| {
anyhow::anyhow!("failed to read large message body for serialization: {e}")
})?;
output.extend_from_slice(&data);
}
}
Ok(output)
}