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}