pub mod error; pub mod meta; pub mod mime; pub mod status; pub use error::Error; pub use meta::Meta; pub use mime::Mime; pub use status::Status; pub struct Header { status: Option, meta: Option, mime: Option, // @TODO // charset: Option, // language: Option, } impl Header { /// Construct from response buffer /// https://geminiprotocol.net/docs/gemtext-specification.gmi#media-type-parameters pub fn from_response(response: &[u8] /* @TODO */) -> Result { let end = Self::end(response)?; let buffer = match response.get(..end) { Some(result) => result, None => return Err(Error::Buffer), }; let meta = match Meta::from_header(buffer) { Ok(result) => Some(result), Err(_) => None, }; let mime = mime::from_header(buffer); // optional // let charset = charset::from_header(buffer); @TODO // let language = language::from_header(buffer); @TODO let status = match status::from_header(buffer) { Ok(result) => Some(result), Err(_) => None, }; Ok(Self { status, meta, mime }) } // Getters pub fn status(&self) -> &Option { &self.status } pub fn mime(&self) -> &Option { &self.mime } pub fn meta(&self) -> &Option { &self.meta } // Tools fn end(buffer: &[u8]) -> Result { for (offset, &byte) in buffer.iter().enumerate() { if byte == b'\r' { return Ok(offset); } } Err(Error::Format) } }