From ba6d64efd3facfbe3865780292bf85ea0003ace6 Mon Sep 17 00:00:00 2001 From: Harald Eilertsen Date: Mon, 20 Nov 2017 15:41:48 +0100 Subject: Use serde_json to create json response when requested by client. --- Cargo.toml | 3 +++ src/lib.rs | 3 +++ src/main.rs | 25 ++++++++++++++++++------- src/models.rs | 2 +- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1e69352..7202391 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,6 @@ r2d2 = "0.7.4" r2d2-diesel = "0.16.0" bart = "0.1.4" bart_derive = "0.1.4" +serde = "1.0" +serde_derive = "1.0" +serde_json = "1.0" diff --git a/src/lib.rs b/src/lib.rs index 8f51d10..097dc66 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,6 +10,9 @@ extern crate r2d2_diesel; extern crate r2d2; extern crate rocket; +#[macro_use] +extern crate serde_derive; + use diesel::pg::PgConnection; use r2d2_diesel::ConnectionManager; use dotenv::dotenv; diff --git a/src/main.rs b/src/main.rs index 03c34df..1794722 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,15 +5,18 @@ extern crate diesel; extern crate rocket; extern crate rocket_blog; #[macro_use] extern crate bart_derive; +extern crate serde; +extern crate serde_json; +#[macro_use] extern crate serde_derive; use self::diesel::prelude::*; use self::rocket_blog::{schema, models}; use rocket::response::{Response, Responder}; use rocket::request::Request; -use rocket::http::{ContentType, Status}; +use rocket::http::{ContentType, MediaType, Status}; use std::io::Cursor; -#[derive(BartDisplay)] +#[derive(BartDisplay, Serialize)] #[template = "templates/index.html"] struct IndexTemplate<'a> { title: &'a str, @@ -21,11 +24,19 @@ struct IndexTemplate<'a> { } impl<'a> Responder<'a> for IndexTemplate<'a> { - fn respond_to(self, _: &Request) -> Result, Status> { - Response::build() - .header(ContentType::HTML) - .sized_body(Cursor::new(format!("{}", &self))) - .ok() + fn respond_to(self, req: &Request) -> Result, Status> { + if req.format().unwrap().is_json() { + Response::build() + .header(ContentType::JSON) + .sized_body(Cursor::new(format!("{}", serde_json::to_string(&self).unwrap()))) + .ok() + } + else { + Response::build() + .header(ContentType::HTML) + .sized_body(Cursor::new(format!("{}", &self))) + .ok() + } } } diff --git a/src/models.rs b/src/models.rs index 110cabe..bebb321 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,4 +1,4 @@ -#[derive(Queryable)] +#[derive(Serialize, Queryable)] pub struct Post { pub id: i32, pub title: String, -- cgit v1.2.3