diff --git a/gotham_restful/src/result/raw.rs b/gotham_restful/src/result/raw.rs index f41ffe6..ec3c848 100644 --- a/gotham_restful/src/result/raw.rs +++ b/gotham_restful/src/result/raw.rs @@ -1,10 +1,10 @@ use super::{IntoResponseError, ResourceResult, handle_error}; -use crate::{Response, StatusCode}; +use crate::{FromBody, FromBodyNoError, RequestBody, ResourceType, Response, StatusCode}; #[cfg(feature = "openapi")] use crate::OpenapiSchema; use futures_core::future::Future; use futures_util::{future, future::FutureExt}; -use gotham::hyper::Body; +use gotham::hyper::body::{Body, Bytes}; use mime::Mime; #[cfg(feature = "openapi")] use openapiv3::{SchemaKind, StringFormat, StringType, Type, VariantOrUnknownOrEmpty}; @@ -14,6 +14,33 @@ use std::{ pin::Pin }; +/** +This type can be used both as a raw request body, as well as as a raw response. However, all types +of request bodies are accepted by this type. It is therefore recommended to derive your own type +from [`RequestBody`] and only use this when you need to return a raw response. This is a usage +example that simply returns its body: + +```rust,no_run +# #[macro_use] extern crate gotham_restful_derive; +# use gotham::router::builder::*; +# use gotham_restful::*; +#[derive(Resource)] +#[resource(create)] +struct ImageResource; + +#[create(ImageResource)] +fn create(body : Raw>) -> Raw> { + body +} +# fn main() { +# gotham::start("127.0.0.1:8080", build_simple_router(|route| { +# route.resource::("img"); +# })); +# } +``` + + [`OpenapiType`]: trait.OpenapiType.html +*/ #[derive(Debug)] pub struct Raw { @@ -29,6 +56,26 @@ impl Raw } } +impl AsMut for Raw +where + T : AsMut +{ + fn as_mut(&mut self) -> &mut U + { + self.raw.as_mut() + } +} + +impl AsRef for Raw +where + T : AsRef +{ + fn as_ref(&self) -> &U + { + self.raw.as_ref() + } +} + impl Clone for Raw { fn clone(&self) -> Self @@ -40,6 +87,22 @@ impl Clone for Raw } } +impl From<&'a [u8]>> FromBody for Raw +{ + type Err = FromBodyNoError; + + fn from_body(body : Bytes, mime : Mime) -> Result + { + Ok(Self::new(body.as_ref().into(), mime)) + } +} + +impl RequestBody for Raw +where + Raw : FromBody + ResourceType +{ +} + impl> ResourceResult for Raw where Self : Send