use std::{borrow::Cow, collections::HashMap, fmt::Display};
#[derive(Debug, Default, Clone, PartialEq, Eq)]
pub struct Meta {
mime: String,
parameters: HashMap<String, String>,
}
impl Display for Meta {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.mime)?;
if !self.parameters.is_empty() {
write!(f, "; ")?;
let mut parameters: Vec<_> = self.parameters.iter().collect();
parameters.sort_by(|a, b| a.0.cmp(b.0));
for (i, (key, value)) in parameters.iter().enumerate() {
if i > 0 {
write!(f, "; ")?;
}
write!(f, "{key}={value}")?;
}
}
Ok(())
}
}
impl Meta {
#[must_use]
pub fn new() -> Self { Self::default() }
#[must_use]
pub fn from_string<'a>(meta: impl Into<std::borrow::Cow<'a, str>>) -> Self {
let meta = meta.into().to_string();
let mut metas = meta.split(';');
let mime = metas.next().unwrap_or("").to_string();
let mut parameters = HashMap::new();
for parameter in metas {
let trimmed = parameter.trim_start();
if let Some(equal_pos) = trimmed.find('=') {
let (key, value) = trimmed.split_at(equal_pos);
parameters.insert(key.to_string(), value[1..].to_string());
}
}
Self { mime, parameters }
}
#[allow(clippy::missing_const_for_fn)]
#[must_use]
pub fn mime(&self) -> Cow<'_, str> { Cow::Borrowed(&self.mime) }
pub const fn mime_mut(&mut self) -> &mut String { &mut self.mime }
#[must_use]
pub const fn parameters(&self) -> &HashMap<String, String> {
&self.parameters
}
pub const fn parameters_mut(&mut self) -> &mut HashMap<String, String> {
&mut self.parameters
}
}