titanite 0.3.0

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

/// [Success](https://geminiprotocol.net/docs/protocol-specification.gmi#success)
pub struct Default<'a> {
    pub data: &'a [u8],
    pub meta: Meta,
}

impl<'a> Default<'a> {
    /// Build `Self` from UTF-8 meta bytes
    /// * expected buffer includes leading status code, message, CRLF
    pub fn from_bytes(buffer: &'a [u8]) -> Result<Self> {
        let meta = Meta::from_bytes(buffer)?;
        Ok(Self {
            data: buffer.get(meta.to_bytes().len()..).unwrap_or(&[]),
            meta,
        })
    }

    /// Convert `Self` into UTF-8 bytes presentation
    pub fn into_bytes(self) -> Vec<u8> {
        let mut bytes = Vec::new();
        bytes.extend(self.meta.into_bytes());
        bytes.extend(self.data);
        bytes
    }
}

#[test]
fn test() {
    const BYTES: &[u8] = "20 text/gemini\r\nDATA".as_bytes();
    let default = Default::from_bytes(BYTES).unwrap();

    assert_eq!(default.meta.mime, "text/gemini".to_string());
    assert_eq!(default.into_bytes(), BYTES);
}

use anyhow::Result;