diff options
author | Martin Fischer <martin@push-f.com> | 2021-01-25 16:56:08 +0100 |
---|---|---|
committer | Martin Fischer <martin@push-f.com> | 2021-01-25 16:59:00 +0100 |
commit | e04c832200f38ab49ce8e7a6d08ffc549b8a98e2 (patch) | |
tree | e3a5e090a7794580bb2899a9c862b19761249deb /src/request.rs | |
parent | 9fa7442e41bc11ab3d62f43f5f6e90b59e160da2 (diff) |
introduce optional SputnikBody::into_json()
bump version to 0.3.2
Diffstat (limited to 'src/request.rs')
-rw-r--r-- | src/request.rs | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/request.rs b/src/request.rs index 509e2e7..5b5679d 100644 --- a/src/request.rs +++ b/src/request.rs @@ -96,6 +96,11 @@ pub trait SputnikBody { /// /// The HTML form must embed a hidden input generated with [`crate::request::SputnikParts::csrf_html_input`]. async fn into_form_csrf<T: DeserializeOwned>(self, req: &mut Parts) -> Result<T, CsrfProtectedFormError>; + + /// Attempts to deserialize the request body as JSON. + #[cfg(feature = "json")] + #[cfg_attr(docsrs, doc(cfg(feature = "json")))] + async fn into_json<T: DeserializeOwned>(self) -> Result<T, JsonError>; } fn csrf_token_from_cookies(req: &mut Parts) -> Option<String> { @@ -125,6 +130,13 @@ impl SputnikBody for hyper::Body { None => Err(CsrfProtectedFormError::NoCookie) } } + + #[cfg(feature = "json")] + #[cfg_attr(docsrs, doc(cfg(feature = "json")))] + async fn into_json<T: DeserializeOwned>(self) -> Result<T, JsonError> { + let full_body = self.into_bytes().await?; + Ok(serde_json::from_slice::<T>(&full_body)?) + } } #[derive(Deserialize)] @@ -156,6 +168,17 @@ pub enum FormError { Deserialize(#[from] serde_urlencoded::de::Error), } +#[cfg(feature = "json")] +#[cfg_attr(docsrs, doc(cfg(feature = "json")))] +#[derive(thiserror::Error, Debug)] +pub enum JsonError { + #[error("{0}")] + Body(#[from] BodyError), + + #[error("json deserialize error: {0}")] + Deserialize(#[from] serde_json::Error), +} + #[derive(thiserror::Error, Debug)] pub enum CsrfProtectedFormError { #[error("{0}")] |