simplify formatter code
This commit is contained in:
		@ -1,49 +1,89 @@
 | 
			
		||||
use failure::*;
 | 
			
		||||
use serde_json::{json, Value};
 | 
			
		||||
 | 
			
		||||
use hyper::{Body, Response, StatusCode};
 | 
			
		||||
use hyper::header;
 | 
			
		||||
 | 
			
		||||
pub struct OutputFormatter {
 | 
			
		||||
 | 
			
		||||
    pub format_result: fn(data: &Value) -> (Vec<u8>, &'static str),
 | 
			
		||||
    pub format_result: fn(data: Result<Value, Error>) -> Response<Body>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn json_format_result(data: &Value) -> (Vec<u8>, &'static str) {
 | 
			
		||||
fn json_format_result(data: Result<Value, Error>) -> Response<Body> {
 | 
			
		||||
 | 
			
		||||
    let content_type = "application/json;charset=UTF-8";
 | 
			
		||||
 | 
			
		||||
    let result = json!({
 | 
			
		||||
        "data": data
 | 
			
		||||
    });
 | 
			
		||||
    match data {
 | 
			
		||||
        Ok(value) => {
 | 
			
		||||
            let result = json!({
 | 
			
		||||
                "data": value
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
    // todo: set result.total result.changes
 | 
			
		||||
            // todo: set result.total result.changes
 | 
			
		||||
 | 
			
		||||
    let json_str = result.to_string();
 | 
			
		||||
            let json_str = result.to_string();
 | 
			
		||||
 | 
			
		||||
    let raw = json_str.into_bytes();
 | 
			
		||||
            let raw = json_str.into_bytes();
 | 
			
		||||
 | 
			
		||||
    (raw, content_type)
 | 
			
		||||
            let mut response = Response::new(raw.into());
 | 
			
		||||
            response.headers_mut().insert(
 | 
			
		||||
                header::CONTENT_TYPE,
 | 
			
		||||
                header::HeaderValue::from_static(content_type));
 | 
			
		||||
            return response;
 | 
			
		||||
        }
 | 
			
		||||
        Err(err) => {
 | 
			
		||||
            let mut response = Response::new(Body::from(err.to_string()));
 | 
			
		||||
            response.headers_mut().insert(
 | 
			
		||||
                header::CONTENT_TYPE,
 | 
			
		||||
                header::HeaderValue::from_static(content_type));
 | 
			
		||||
            *response.status_mut() = StatusCode::BAD_REQUEST;
 | 
			
		||||
            return response;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub static JSON_FORMATTER: OutputFormatter = OutputFormatter {
 | 
			
		||||
    format_result: json_format_result,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
fn extjs_format_result(data: &Value) -> (Vec<u8>, &'static str) {
 | 
			
		||||
fn extjs_format_result(data: Result<Value, Error>) -> Response<Body> {
 | 
			
		||||
 | 
			
		||||
    let content_type = "application/json;charset=UTF-8";
 | 
			
		||||
 | 
			
		||||
    let result = json!({
 | 
			
		||||
        "data": data,
 | 
			
		||||
        "success": true
 | 
			
		||||
    });
 | 
			
		||||
    let result = match data {
 | 
			
		||||
        Ok(value) => {
 | 
			
		||||
            let result = json!({
 | 
			
		||||
                "data": value,
 | 
			
		||||
                "success": true
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
    // todo: set result.total result.changes
 | 
			
		||||
            // todo: set result.total result.changes
 | 
			
		||||
 | 
			
		||||
            result
 | 
			
		||||
        }
 | 
			
		||||
        Err(err) => {
 | 
			
		||||
            let mut errors = vec![];
 | 
			
		||||
 | 
			
		||||
            errors.push(err.to_string());
 | 
			
		||||
 | 
			
		||||
            let result = json!({
 | 
			
		||||
                "errors": errors,
 | 
			
		||||
                "success": false
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            result
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    let json_str = result.to_string();
 | 
			
		||||
 | 
			
		||||
    let raw = json_str.into_bytes();
 | 
			
		||||
 | 
			
		||||
    (raw, content_type)
 | 
			
		||||
    let mut response = Response::new(raw.into());
 | 
			
		||||
    response.headers_mut().insert(
 | 
			
		||||
        header::CONTENT_TYPE,
 | 
			
		||||
        header::HeaderValue::from_static(content_type));
 | 
			
		||||
    response
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub static EXTJS_FORMATTER: OutputFormatter = OutputFormatter {
 | 
			
		||||
 | 
			
		||||
@ -171,36 +171,10 @@ fn handle_sync_api_request(
 | 
			
		||||
 | 
			
		||||
    let resp = params
 | 
			
		||||
        .and_then(move |params| {
 | 
			
		||||
 | 
			
		||||
            println!("GOT PARAMS {}", params);
 | 
			
		||||
 | 
			
		||||
            /*
 | 
			
		||||
            let when = Instant::now() + Duration::from_millis(3000);
 | 
			
		||||
            let task = Delay::new(when).then(|_| {
 | 
			
		||||
                println!("A LAZY TASK");
 | 
			
		||||
                ok(())
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            tokio::spawn(task);
 | 
			
		||||
             */
 | 
			
		||||
 | 
			
		||||
            let res = (info.handler)(params, info)?;
 | 
			
		||||
 | 
			
		||||
            Ok(res)
 | 
			
		||||
 | 
			
		||||
        }).then(move |result| {
 | 
			
		||||
            match result {
 | 
			
		||||
                Ok(ref value) => {
 | 
			
		||||
 | 
			
		||||
                    let (raw, content_type) = (formatter.format_result)(value);
 | 
			
		||||
 | 
			
		||||
                    Ok(Response::builder()
 | 
			
		||||
                       .status(StatusCode::OK)
 | 
			
		||||
                       .header(header::CONTENT_TYPE, content_type)
 | 
			
		||||
                       .body(Body::from(raw))?)
 | 
			
		||||
                }
 | 
			
		||||
                Err(err) => Err(http_err!(BAD_REQUEST, err.to_string()))
 | 
			
		||||
            }
 | 
			
		||||
            Ok((formatter.format_result)(result))
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
    Box::new(resp)
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user