use mime::Mime;
use std::collections::BTreeMap;
use std::fmt::{Display, Formatter};
#[derive(Debug, Default, PartialEq)]
pub enum Body {
#[default]
None,
Raw { content: String, mime: Mime },
Binary { path: String, mime: Mime },
FormData(BTreeMap<String, FormDataValue>),
XFormUrlEncoded(BTreeMap<String, String>),
}
#[derive(Debug, PartialEq)]
pub enum FormDataValue {
Text(String),
File(String),
}
impl Body {
#[must_use]
pub fn mime(&self) -> Option<&Mime> {
match self {
Body::None => None,
Body::Raw { mime, .. } | Body::Binary { mime, .. } => Some(mime),
Body::FormData(_) => Some(&mime::MULTIPART_FORM_DATA),
Body::XFormUrlEncoded(_) => Some(&mime::APPLICATION_WWW_FORM_URLENCODED),
}
}
}
impl Display for Body {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
use Body::{Binary, FormData, None, Raw, XFormUrlEncoded};
match self {
None => Ok(()),
Raw { content, .. } => write!(f, "{content}"),
Binary { path, .. } => write!(f, "@{path}"),
FormData(map) => {
for (k, v) in map {
write!(f, "{k}: {v}")?;
}
Ok(())
}
XFormUrlEncoded(map) => {
for (k, v) in map {
write!(f, "{k}: {v}")?;
}
Ok(())
}
}
}
}
impl Display for FormDataValue {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
FormDataValue::Text(value) => f.write_str(value),
FormDataValue::File(path) => write!(f, "@{path}"),
}
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
#[ignore]
fn display() {
let content = r#"
{
"key": "value"
}
"#
.to_string();
let body = Body::Raw {
content,
mime: mime::TEXT_PLAIN,
};
println!("{body}");
let body = Body::Binary {
path: "path/to/file".to_string(),
mime: mime::STAR_STAR,
};
println!("{body}");
let mut map = BTreeMap::new();
map.insert("text".to_string(), FormDataValue::Text("value".to_string()));
map.insert("file".to_string(), FormDataValue::File("path".to_string()));
let body = Body::FormData(map);
println!("{body}");
let mut map = BTreeMap::new();
map.insert("key".to_string(), "val".to_string());
map.insert("other".to_string(), "val".to_string());
let body = Body::XFormUrlEncoded(map);
println!("{body}");
}
}