make mime type optional

This commit is contained in:
yggverse 2024-11-01 04:32:53 +02:00
parent 5c0b8bf386
commit 8bfea4ffcf
2 changed files with 20 additions and 14 deletions

View file

@ -23,7 +23,7 @@ pub const MAX_LEN: usize = 0x400; // 1024
pub struct Meta { pub struct Meta {
data: Data, data: Data,
mime: Mime, mime: Option<Mime>,
status: Status, status: Status,
// @TODO // @TODO
// charset: Charset, // charset: Charset,
@ -129,7 +129,7 @@ impl Meta {
&self.data &self.data
} }
pub fn mime(&self) -> &Mime { pub fn mime(&self) -> &Option<Mime> {
&self.mime &self.mime
} }
} }

View file

@ -24,7 +24,7 @@ pub enum Mime {
} // @TODO } // @TODO
impl Mime { impl Mime {
pub fn from_utf8(buffer: &[u8]) -> Result<Self, Error> { pub fn from_utf8(buffer: &[u8]) -> Result<Option<Self>, Error> {
let len = buffer.len(); let len = buffer.len();
match buffer.get(..if len > MAX_LEN { MAX_LEN } else { len }) { match buffer.get(..if len > MAX_LEN { MAX_LEN } else { len }) {
Some(value) => match GString::from_utf8(value.into()) { Some(value) => match GString::from_utf8(value.into()) {
@ -53,47 +53,53 @@ impl Mime {
} // @TODO extension to lowercase } // @TODO extension to lowercase
} }
pub fn from_string(value: &str) -> Result<Self, Error> { pub fn from_string(value: &str) -> Result<Option<Self>, Error> {
// Text // Text
if value.contains("text/gemini") { if value.contains("text/gemini") {
return Ok(Self::TextGemini); return Ok(Some(Self::TextGemini));
} }
if value.contains("text/plain") { if value.contains("text/plain") {
return Ok(Self::TextPlain); return Ok(Some(Self::TextPlain));
} }
// Image // Image
if value.contains("image/gif") { if value.contains("image/gif") {
return Ok(Self::ImageGif); return Ok(Some(Self::ImageGif));
} }
if value.contains("image/jpeg") { if value.contains("image/jpeg") {
return Ok(Self::ImageJpeg); return Ok(Some(Self::ImageJpeg));
} }
if value.contains("image/webp") { if value.contains("image/webp") {
return Ok(Self::ImageWebp); return Ok(Some(Self::ImageWebp));
} }
if value.contains("image/png") { if value.contains("image/png") {
return Ok(Self::ImagePng); return Ok(Some(Self::ImagePng));
} }
// Audio // Audio
if value.contains("audio/flac") { if value.contains("audio/flac") {
return Ok(Self::AudioFlac); return Ok(Some(Self::AudioFlac));
} }
if value.contains("audio/mpeg") { if value.contains("audio/mpeg") {
return Ok(Self::AudioMpeg); return Ok(Some(Self::AudioMpeg));
} }
if value.contains("audio/ogg") { if value.contains("audio/ogg") {
return Ok(Self::AudioOgg); return Ok(Some(Self::AudioOgg));
} }
Err(Error::Undefined) // Some type exist, but not defined yet
if value.contains("/") {
return Err(Error::Undefined);
}
// Done
Ok(None) // may be empty (for some status codes)
} }
pub fn from_uri(uri: &Uri) -> Result<Self, Error> { pub fn from_uri(uri: &Uri) -> Result<Self, Error> {