1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//! This module implements helpers for the JSON support in Pencil.

use rustc_serialize::json;
use rustc_serialize::Encodable;

use wrappers::{Response};
use types::{PencilResult, PenUserError, UserError};


/// Creates a view result with the JSON representation of the given object
/// with an *application/json* mimetype. Example usage:
///
/// ```ignore
/// extern crate rustc_serialize;
///
/// use pencil::{Request, PencilResult, jsonify};
///
/// #[derive(RustcEncodable)]
/// struct User {
///     id: u8,
///     name: String,
/// }
///
/// fn get_user(_: &mut Request) -> PencilResult {
///     let user = User {
///         id: 1,
///         name: String::from("admin"),
///     };
///     return jsonify(&user);
/// }
/// ```
pub fn jsonify<T: Encodable>(object: &T) -> PencilResult {
    match json::encode(object) {
        Ok(encoded) => {
            let mut response = Response::from(encoded);
            response.set_content_type("application/json");
            Ok(response)
        },
        Err(err) => {
            let error = UserError::new(format!("Json encoder error: {}", err));
            Err(PenUserError(error))
        },
    }
}