From f5a5ea3a22a5807673003ab14921e060714633b3 Mon Sep 17 00:00:00 2001 From: Sergio Benitez Date: Tue, 25 Oct 2016 13:03:50 +0200 Subject: [PATCH] Rename `data` to `content` in `response`. Remove `DataOutcome`. --- contrib/src/json/mod.rs | 16 +++---- contrib/src/templates/mod.rs | 8 ++-- examples/content_types/src/main.rs | 8 ++-- examples/raw_upload/src/main.rs | 2 +- examples/stream/src/main.rs | 6 +-- lib/src/catcher.rs | 4 +- lib/src/outcome.rs | 20 +-------- lib/src/request/data/from_data.rs | 53 +++++++++--------------- lib/src/request/data/mod.rs | 2 +- lib/src/request/form/mod.rs | 13 +++--- lib/src/request/from_request.rs | 11 ++++- lib/src/request/mod.rs | 5 ++- lib/src/response/{data.rs => content.rs} | 0 lib/src/response/failure.rs | 12 ++++++ lib/src/response/mod.rs | 44 +++----------------- lib/src/response/responder.rs | 10 +++++ lib/src/response/response.rs | 35 ++++++++++++++++ 17 files changed, 127 insertions(+), 122 deletions(-) rename lib/src/response/{data.rs => content.rs} (100%) create mode 100644 lib/src/response/failure.rs create mode 100644 lib/src/response/response.rs diff --git a/contrib/src/json/mod.rs b/contrib/src/json/mod.rs index 67a49a3c..72a10adf 100644 --- a/contrib/src/json/mod.rs +++ b/contrib/src/json/mod.rs @@ -4,9 +4,9 @@ extern crate serde_json; use std::ops::{Deref, DerefMut}; use std::io::Read; -use rocket::Outcome::*; -use rocket::request::{Request, Data, FromData, DataOutcome}; -use rocket::response::{self, Responder, data}; +use rocket::outcome::{Outcome, IntoOutcome}; +use rocket::request::{data, Request, Data, FromData}; +use rocket::response::{self, Responder, content}; use rocket::http::StatusCode; use rocket::http::hyper::FreshHyperResponse; @@ -71,24 +71,24 @@ const MAX_SIZE: u64 = 1048576; impl FromData for JSON { type Error = SerdeError; - fn from_data(request: &Request, data: Data) -> DataOutcome { + fn from_data(request: &Request, data: Data) -> data::Outcome { if !request.content_type().is_json() { error_!("Content-Type is not JSON."); - return DataOutcome::forward(data); + return Outcome::Forward(data); } let reader = data.open().take(MAX_SIZE); - DataOutcome::of(serde_json::from_reader(reader).map(|val| JSON(val))) + serde_json::from_reader(reader).map(|val| JSON(val)).into_outcome() } } impl Responder for JSON { fn respond<'a>(&mut self, res: FreshHyperResponse<'a>) -> response::Outcome<'a> { match serde_json::to_string(&self.0) { - Ok(json_string) => data::JSON(json_string).respond(res), + Ok(json_string) => content::JSON(json_string).respond(res), Err(e) => { error_!("JSON failed to serialize: {:?}", e); - Forward((StatusCode::BadRequest, res)) + Outcome::Forward((StatusCode::BadRequest, res)) } } } diff --git a/contrib/src/templates/mod.rs b/contrib/src/templates/mod.rs index 7e5c795a..600abcfd 100644 --- a/contrib/src/templates/mod.rs +++ b/contrib/src/templates/mod.rs @@ -17,10 +17,10 @@ use std::path::{Path, PathBuf}; use std::collections::HashMap; use rocket::config; -use rocket::response::{Content, Outcome, Responder}; +use rocket::response::{self, Content, Responder}; use rocket::http::hyper::FreshHyperResponse; use rocket::http::{ContentType, StatusCode}; -use rocket::Outcome::*; +use rocket::Outcome; /// The Template type implements generic support for template rendering in /// Rocket. @@ -160,7 +160,7 @@ impl Template { } impl Responder for Template { - fn respond<'a>(&mut self, res: FreshHyperResponse<'a>) -> Outcome<'a> { + fn respond<'a>(&mut self, res: FreshHyperResponse<'a>) -> response::Outcome<'a> { let content_type = match self.1 { Some(ref ext) => ContentType::from_extension(ext), None => ContentType::html() @@ -168,7 +168,7 @@ impl Responder for Template { match self.0 { Some(ref render) => Content(content_type, render.as_str()).respond(res), - None => Forward((StatusCode::InternalServerError, res)), + None => Outcome::Forward((StatusCode::InternalServerError, res)), } } } diff --git a/examples/content_types/src/main.rs b/examples/content_types/src/main.rs index 1b29185a..371a5983 100644 --- a/examples/content_types/src/main.rs +++ b/examples/content_types/src/main.rs @@ -7,7 +7,7 @@ extern crate serde_json; use rocket::{Request, Error}; use rocket::http::ContentType; -use rocket::response::data; +use rocket::response::content::JSON; #[derive(Debug, Serialize, Deserialize)] struct Person { @@ -15,15 +15,17 @@ struct Person { age: i8, } +// This shows how to manually serialize some JSON, but in a real application, +// we'd use the JSON contrib type. #[get("//", format = "application/json")] -fn hello(content_type: ContentType, name: String, age: i8) -> data::JSON { +fn hello(content_type: ContentType, name: String, age: i8) -> JSON { let person = Person { name: name, age: age, }; println!("ContentType: {}", content_type); - data::JSON(serde_json::to_string(&person).unwrap()) + JSON(serde_json::to_string(&person).unwrap()) } #[error(404)] diff --git a/examples/raw_upload/src/main.rs b/examples/raw_upload/src/main.rs index 8f34d71a..2525b051 100644 --- a/examples/raw_upload/src/main.rs +++ b/examples/raw_upload/src/main.rs @@ -6,7 +6,7 @@ extern crate rocket; use std::io; use rocket::request::Data; -use rocket::response::data::Plain; +use rocket::response::content::Plain; #[post("/upload", format = "text/plain", data = "")] fn upload(data: Data) -> io::Result> { diff --git a/examples/stream/src/main.rs b/examples/stream/src/main.rs index 7304b4f6..2dbd1079 100644 --- a/examples/stream/src/main.rs +++ b/examples/stream/src/main.rs @@ -3,7 +3,7 @@ extern crate rocket; -use rocket::response::{data, Stream}; +use rocket::response::{content, Stream}; use std::io::{self, repeat, Repeat, Read, Take}; use std::fs::File; @@ -11,8 +11,8 @@ use std::fs::File; type LimitedRepeat = Take; #[get("/")] -fn root() -> data::Plain> { - data::Plain(Stream::from(repeat('a' as u8).take(25000))) +fn root() -> content::Plain> { + content::Plain(Stream::from(repeat('a' as u8).take(25000))) } #[get("/big_file")] diff --git a/lib/src/catcher.rs b/lib/src/catcher.rs index eb3bf3a1..5a984b09 100644 --- a/lib/src/catcher.rs +++ b/lib/src/catcher.rs @@ -74,7 +74,7 @@ macro_rules! default_errors { $( fn $fn_name<'r>(_: Error, _r: &'r Request) -> Response<'r> { Response::with_raw_status($code, - data::HTML(error_page_template!($code, $name, $description)) + content::HTML(error_page_template!($code, $name, $description)) ) } @@ -91,7 +91,7 @@ pub mod defaults { use std::collections::HashMap; use request::Request; - use response::{Response, data}; + use response::{Response, content}; use error::Error; pub fn get() -> HashMap { diff --git a/lib/src/outcome.rs b/lib/src/outcome.rs index 7e10c725..1a94f9ec 100644 --- a/lib/src/outcome.rs +++ b/lib/src/outcome.rs @@ -86,7 +86,6 @@ use term_painter::Color; use term_painter::ToStyle; use self::Outcome::*; -use http::hyper::{FreshHyperResponse, StatusCode}; /// An enum representing success (`Success`), failure (`Failure`), or /// forwarding (`Forward`). @@ -101,28 +100,11 @@ pub enum Outcome { Forward(F), } +/// Conversion trait from some type into an Outcome type. pub trait IntoOutcome { fn into_outcome(self) -> Outcome; } -impl IntoOutcome for Result { - fn into_outcome(self) -> Outcome { - match self { - Ok(val) => Success(val), - Err(val) => Failure((StatusCode::BadRequest, val)) - } - } -} - -impl<'a, T, E> IntoOutcome<(), (), (StatusCode, FreshHyperResponse<'a>)> for Result { - fn into_outcome(self) -> Outcome<(), (), (StatusCode, FreshHyperResponse<'a>)> { - match self { - Ok(_) => Success(()), - Err(_) => Failure(()) - } - } -} - impl Outcome { /// Unwraps the Outcome, yielding the contents of a Success. /// diff --git a/lib/src/request/data/from_data.rs b/lib/src/request/data/from_data.rs index 32166fa1..7258fc52 100644 --- a/lib/src/request/data/from_data.rs +++ b/lib/src/request/data/from_data.rs @@ -1,33 +1,18 @@ -use outcome::Outcome; +use outcome::{self, IntoOutcome}; +use outcome::Outcome::*; use http::StatusCode; use request::{Request, Data}; /// Type alias for the `Outcome` of a `FromData` conversion. -pub type DataOutcome = Outcome; +pub type Outcome = outcome::Outcome; -impl DataOutcome { - #[inline(always)] - pub fn of(result: Result) -> Self { - match result { - Ok(val) => DataOutcome::success(val), - Err(err) => DataOutcome::failure(StatusCode::InternalServerError, err) +impl<'a, S, E> IntoOutcome for Result { + fn into_outcome(self) -> Outcome { + match self { + Ok(val) => Success(val), + Err(err) => Failure((StatusCode::InternalServerError, err)) } } - - #[inline(always)] - pub fn success(s: S) -> Self { - Outcome::Success(s) - } - - #[inline(always)] - pub fn failure(status: StatusCode, e: E) -> Self { - Outcome::Failure((status, e)) - } - - #[inline(always)] - pub fn forward(data: Data) -> Self { - Outcome::Forward(data) - } } /// Trait used to derive an object from incoming request data. @@ -75,25 +60,25 @@ pub trait FromData: Sized { /// If the parse is successful, an outcome of `Success` is returned. If the /// data does not correspond to the type of `Self`, `Forward` is returned. /// If parsing fails, `Failure` is returned. - fn from_data(request: &Request, data: Data) -> DataOutcome; + fn from_data(request: &Request, data: Data) -> Outcome; } /// The identity implementation of `FromData`. Always returns `Success`. impl FromData for Data { type Error = (); - fn from_data(_: &Request, data: Data) -> DataOutcome { - DataOutcome::success(data) + fn from_data(_: &Request, data: Data) -> Outcome { + Success(data) } } impl FromData for Result { type Error = (); - fn from_data(request: &Request, data: Data) -> DataOutcome { + fn from_data(request: &Request, data: Data) -> Outcome { match T::from_data(request, data) { - Outcome::Success(val) => DataOutcome::success(Ok(val)), - Outcome::Failure((_, val)) => DataOutcome::success(Err(val)), - Outcome::Forward(data) => DataOutcome::forward(data), + Success(val) => Success(Ok(val)), + Failure((_, val)) => Success(Err(val)), + Forward(data) => Forward(data), } } } @@ -101,11 +86,11 @@ impl FromData for Result { impl FromData for Option { type Error = (); - fn from_data(request: &Request, data: Data) -> DataOutcome { + fn from_data(request: &Request, data: Data) -> Outcome { match T::from_data(request, data) { - Outcome::Success(val) => DataOutcome::success(Some(val)), - Outcome::Failure(_) => DataOutcome::success(None), - Outcome::Forward(_) => DataOutcome::success(None) + Success(val) => Success(Some(val)), + Failure(_) => Success(None), + Forward(_) => Success(None) } } } diff --git a/lib/src/request/data/mod.rs b/lib/src/request/data/mod.rs index 2ec4d409..55c88e8f 100644 --- a/lib/src/request/data/mod.rs +++ b/lib/src/request/data/mod.rs @@ -5,7 +5,7 @@ #[cfg(not(any(test, feature = "testing")))] pub mod data_stream; mod from_data; -pub use self::from_data::{FromData, DataOutcome}; +pub use self::from_data::{FromData, Outcome}; #[cfg(any(test, feature = "testing"))] pub use self::test_data::Data; #[cfg(not(any(test, feature = "testing")))] pub use self::data::Data; diff --git a/lib/src/request/form/mod.rs b/lib/src/request/form/mod.rs index a3adfe96..9c2afd1d 100644 --- a/lib/src/request/form/mod.rs +++ b/lib/src/request/form/mod.rs @@ -28,7 +28,8 @@ use std::fmt::{self, Debug}; use std::io::Read; use http::StatusCode; -use request::{Request, FromData, Data, DataOutcome}; +use request::{data, Request, FromData, Data}; +use outcome::Outcome::*; // TODO: This works and is safe, but the lifetime appears twice. /// A `FromData` type for parsing `FromForm` types. @@ -230,23 +231,23 @@ impl<'f, T: FromForm<'f> + Debug + 'f> Debug for Form<'f, T> { impl<'f, T: FromForm<'f>> FromData for Form<'f, T> where T::Error: Debug { type Error = Option; - fn from_data(request: &Request, data: Data) -> DataOutcome { + fn from_data(request: &Request, data: Data) -> data::Outcome { if !request.content_type().is_form() { warn_!("Form data does not have form content type."); - return DataOutcome::forward(data); + return Forward(data); } let mut form_string = String::with_capacity(4096); let mut stream = data.open().take(32768); if let Err(e) = stream.read_to_string(&mut form_string) { error_!("IO Error: {:?}", e); - DataOutcome::failure(StatusCode::InternalServerError, None) + Failure((StatusCode::InternalServerError, None)) } else { match Form::new(form_string) { - Ok(form) => DataOutcome::success(form), + Ok(form) => Success(form), Err((form_string, e)) => { error_!("Failed to parse value from form: {:?}", e); - DataOutcome::failure(StatusCode::BadRequest, Some(form_string)) + Failure((StatusCode::BadRequest, Some(form_string))) } } } diff --git a/lib/src/request/from_request.rs b/lib/src/request/from_request.rs index 6a52a780..59901bdd 100644 --- a/lib/src/request/from_request.rs +++ b/lib/src/request/from_request.rs @@ -1,6 +1,6 @@ use std::fmt::Debug; -use outcome; +use outcome::{self, IntoOutcome}; use request::Request; use outcome::Outcome::*; use http::{StatusCode, ContentType, Method, Cookies}; @@ -8,6 +8,15 @@ use http::{StatusCode, ContentType, Method, Cookies}; /// Type alias for the `Outcome` of a `FromRequest` conversion. pub type Outcome = outcome::Outcome; +impl IntoOutcome for Result { + fn into_outcome(self) -> Outcome { + match self { + Ok(val) => Success(val), + Err(val) => Failure((StatusCode::BadRequest, val)) + } + } +} + pub trait FromRequest<'r>: Sized { type Error: Debug; diff --git a/lib/src/request/mod.rs b/lib/src/request/mod.rs index 8f77db86..085e5f75 100644 --- a/lib/src/request/mod.rs +++ b/lib/src/request/mod.rs @@ -17,11 +17,12 @@ mod request; mod param; mod form; -mod data; mod from_request; +pub mod data; + pub use self::request::Request; pub use self::from_request::{FromRequest, Outcome}; pub use self::param::{FromParam, FromSegments}; pub use self::form::{Form, FromForm, FromFormValue, FormItems}; -pub use self::data::{Data, FromData, DataOutcome}; +pub use self::data::{Data, FromData}; diff --git a/lib/src/response/data.rs b/lib/src/response/content.rs similarity index 100% rename from lib/src/response/data.rs rename to lib/src/response/content.rs diff --git a/lib/src/response/failure.rs b/lib/src/response/failure.rs new file mode 100644 index 00000000..12aadf21 --- /dev/null +++ b/lib/src/response/failure.rs @@ -0,0 +1,12 @@ +use outcome::Outcome; +use response::{self, Responder}; +use http::hyper::{FreshHyperResponse, StatusCode}; + +#[derive(Debug)] +pub struct Failure(pub StatusCode); + +impl Responder for Failure { + fn respond<'a>(&mut self, res: FreshHyperResponse<'a>) -> response::Outcome<'a> { + Outcome::Forward((self.0, res)) + } +} diff --git a/lib/src/response/mod.rs b/lib/src/response/mod.rs index 6e3ab6b0..ecdd6b34 100644 --- a/lib/src/response/mod.rs +++ b/lib/src/response/mod.rs @@ -4,49 +4,17 @@ mod with_status; mod flash; mod named_file; mod stream; +mod response; +mod failure; -pub mod data; +pub mod content; +pub use self::response::Response; pub use self::responder::{Outcome, Responder}; pub use self::redirect::Redirect; pub use self::with_status::StatusResponse; pub use self::flash::Flash; pub use self::named_file::NamedFile; pub use self::stream::Stream; -pub use self::data::Content; - -use outcome; -use request::Data; -use http::hyper::StatusCode; -use outcome::Outcome::*; - -pub type Response<'a> = outcome::Outcome, StatusCode, Data>; - -impl<'a> Response<'a> { - #[inline(always)] - pub fn success(responder: T) -> Response<'a> { - Success(Box::new(responder)) - } - - #[inline(always)] - pub fn failure(code: StatusCode) -> Response<'static> { - Failure(code) - } - - #[inline(always)] - pub fn forward(data: Data) -> Response<'static> { - Forward(data) - } - - #[inline(always)] - pub fn with_raw_status(status: u16, body: T) -> Response<'a> { - let status_code = StatusCode::from_u16(status); - Response::success(StatusResponse::new(status_code, body)) - } - - #[doc(hidden)] - #[inline(always)] - pub fn responder(self) -> Option> { - self.succeeded() - } -} +pub use self::content::Content; +pub use self::failure::Failure; diff --git a/lib/src/response/responder.rs b/lib/src/response/responder.rs index 2621c7ff..03dfe8f0 100644 --- a/lib/src/response/responder.rs +++ b/lib/src/response/responder.rs @@ -9,6 +9,16 @@ use outcome::Outcome::*; pub type Outcome<'a> = outcome::Outcome<(), (), (StatusCode, FreshHyperResponse<'a>)>; + +impl<'a, T, E> IntoOutcome<(), (), (StatusCode, FreshHyperResponse<'a>)> for Result { + fn into_outcome(self) -> Outcome<'a> { + match self { + Ok(_) => Success(()), + Err(_) => Failure(()) + } + } +} + pub trait Responder { fn respond<'a>(&mut self, mut res: FreshHyperResponse<'a>) -> Outcome<'a>; } diff --git a/lib/src/response/response.rs b/lib/src/response/response.rs new file mode 100644 index 00000000..d14e1669 --- /dev/null +++ b/lib/src/response/response.rs @@ -0,0 +1,35 @@ +use request::Data; +use outcome::{self, Outcome}; +use http::hyper::StatusCode; +use response::{Responder, StatusResponse}; + +pub type Response<'a> = outcome::Outcome, StatusCode, Data>; + +impl<'a> Response<'a> { + #[inline(always)] + pub fn success(responder: T) -> Response<'a> { + Outcome::Success(Box::new(responder)) + } + + #[inline(always)] + pub fn failure(code: StatusCode) -> Response<'static> { + Outcome::Failure(code) + } + + #[inline(always)] + pub fn forward(data: Data) -> Response<'static> { + Outcome::Forward(data) + } + + #[inline(always)] + pub fn with_raw_status(status: u16, body: T) -> Response<'a> { + let status_code = StatusCode::from_u16(status); + Response::success(StatusResponse::new(status_code, body)) + } + + #[doc(hidden)] + #[inline(always)] + pub fn responder(self) -> Option> { + self.succeeded() + } +}