#![warn(missing_docs)]
#[derive(Debug, Clone, PartialEq)]
pub enum RequestBody {
TEXT(TextData),
JSON(serde_json::Value),
FORM(FormData),
BINARY(Bytes),
BinaryWithFields(Bytes, FormData),
EMPTY,
}
#[derive(PartialEq, Debug, Clone)]
pub enum RequestBodyType {
TEXT,
JSON,
FORM,
BINARY,
EMPTY,
MultipartForm,
}
impl Display for RequestBodyType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
RequestBodyType::TEXT => write!(f, "text/plain"),
RequestBodyType::JSON => write!(f, "application/json"),
RequestBodyType::FORM => write!(f, "application/x-www-form-urlencoded"),
RequestBodyType::BINARY => write!(f, "application/octet-stream"),
RequestBodyType::EMPTY => write!(f, ""),
RequestBodyType::MultipartForm => write!(f, "multipart/form-data"),
}
}
}
impl RequestBody {
pub fn len(&self) -> usize {
match self {
RequestBody::TEXT(text) => text.len(),
RequestBody::JSON(json) => serde_json::to_vec(json).map(|v| v.len()).unwrap_or(0),
RequestBody::BINARY(bytes) => bytes.len(),
RequestBody::BinaryWithFields(bytes, _form_data) => bytes.len(),
RequestBody::EMPTY => 0,
RequestBody::FORM(form_data) => form_data.byte_len(),
}
}
pub fn body_type(&self) -> RequestBodyType {
match self {
RequestBody::TEXT(_) => RequestBodyType::TEXT,
RequestBody::JSON(_) => RequestBodyType::JSON,
RequestBody::FORM(_) => RequestBodyType::FORM,
RequestBody::BINARY(_) => RequestBodyType::BINARY,
RequestBody::BinaryWithFields(_, _) => RequestBodyType::BINARY,
RequestBody::EMPTY => RequestBodyType::EMPTY,
}
}
}
pub mod form_data;
pub mod json_data;
pub mod text_data;
use std::fmt::Display;
use bytes::Bytes;
pub use form_data::FormData;
pub use text_data::TextData;
impl RequestBody {
pub(crate) fn new_text(text: TextData) -> Self {
RequestBody::TEXT(text)
}
pub(crate) fn new_binary<T: Into<Bytes>>(bytes: T) -> Self {
RequestBody::BINARY(bytes.into())
}
pub(crate) fn _new_empty() -> Self {
Self::EMPTY
}
pub(crate) fn new_binary_with_form_fields(bytes: Bytes, form_data: FormData) -> Self {
RequestBody::BinaryWithFields(bytes, form_data)
}
pub(crate) fn new_form(form_data: FormData) -> Self {
RequestBody::FORM(form_data)
}
pub(crate) fn new_json<T: Into<serde_json::Value>>(json: T) -> Self {
RequestBody::JSON(json.into())
}
}