use bytes::Bytes;
use http::HeaderValue;
use http_body_util::Full;
use crate::body::{
Body,
codec::{BodyContentType, BodyEncoder},
};
#[derive(Clone, Debug)]
pub struct FormEncoder {
pub content_type: HeaderValue,
}
impl Default for FormEncoder {
fn default() -> Self {
Self {
content_type: HeaderValue::from_static("application/x-www-form-urlencoded"),
}
}
}
impl BodyContentType for FormEncoder {
fn content_type(&self) -> HeaderValue {
self.content_type.clone()
}
}
impl<T: serde::Serialize + ?Sized> BodyEncoder<&T> for FormEncoder {
type Error = serde_urlencoded::ser::Error;
fn encode(&self, data: &T) -> Result<Body, Self::Error> {
let encoded = serde_urlencoded::to_string(data)?;
Ok(Body::new(Full::new(Bytes::from(encoded))))
}
}