pub mod default;
pub use default::Default;
use anyhow::{bail, Result};
pub enum Success<'a> {
Default(Default<'a>),
}
impl<'a> Success<'a> {
pub fn from_bytes(buffer: &'a [u8]) -> Result<Self> {
if buffer.first().is_none_or(|b| *b != b'2') {
bail!("Unexpected first byte")
}
match buffer.get(1) {
Some(byte) => Ok(match byte {
b'0' => Self::Default(Default::from_bytes(buffer)?),
b => bail!("Unexpected second byte: {b}"),
}),
None => bail!("Invalid request"),
}
}
pub fn into_bytes(self) -> Vec<u8> {
match self {
Self::Default(this) => this.into_bytes(),
}
}
}
#[test]
fn test() {
let request = format!("20 text/gemini\r\ndata");
let source = Success::from_bytes(request.as_bytes()).unwrap();
match source {
Success::Default(ref this) => {
assert_eq!(this.mime, "text/gemini".to_string());
assert_eq!(this.data, "data".as_bytes());
}
}
assert_eq!(source.into_bytes(), request.as_bytes());
}