neon_frame/
lib.rs

1extern crate serde;
2#[macro_use]
3extern crate serde_derive;
4
5#[derive(Serialize)]
6pub struct StatusErrorJson {
7    pub code: usize,
8    pub message: String,
9}
10
11#[derive(Serialize)]
12pub struct StatusJson<T> {
13    pub succeeded: bool,
14    pub result: Option<T>,
15    pub error: Option<StatusErrorJson>,
16}
17
18#[derive(Debug, Clone)]
19pub enum StatusResult<T> {
20    Ok(T),
21    Error(usize, String),
22}
23
24impl<T> StatusResult<T>
25    where
26        T: Clone + serde::Serialize,
27{
28
29    pub fn from<E>(value: Result<T, E>) -> StatusResult<T> where E: Into<(usize, String)> {
30        match value {
31            Ok(v) => StatusResult::Ok(v),
32            Err(e) => {
33                let err: (usize, String) = e.into();
34                StatusResult::Error(err.0, err.1)
35            }
36        }
37    }
38
39    pub fn as_json(&self) -> String {
40        let obj = match self {
41            StatusResult::Ok(ref t) => StatusJson {
42                succeeded: true,
43                result: Some(t.clone()),
44                error: None,
45            },
46            StatusResult::Error(code, message) => StatusJson {
47                succeeded: false,
48                result: None,
49                error: Some(StatusErrorJson {
50                    code: *code,
51                    message: message.clone(),
52                }),
53            },
54        };
55        let result = serde_json::to_string(&obj)
56            .map_err(|_| "{\"succeeded\": false, \"error\": {\"code\": 0, \"message\": \"Failed to convert resulting JSON\"}}".to_string());
57        match result {
58            Ok(v) => v,
59            Err(v) => v
60        }
61    }
62}