titanite 0.3.0

Client/Server Library for Gemini protocol with Titan support
Documentation
pub mod default;
pub use default::Default;

use anyhow::{bail, Result};

/// [Success](https://geminiprotocol.net/docs/protocol-specification.gmi#success)
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.meta.mime, "text/gemini");
            assert_eq!(this.data, "DATA".as_bytes());
        }
    }
    assert_eq!(source.into_bytes(), request.as_bytes());
}