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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
use std::fmt;
use actix_web::error::ResponseError;
use actix_web::*;
use failure::{Backtrace, Context, Fail};
use views::error;
#[derive(Debug)]
pub struct FrontendError {
context: Context<FrontendErrorKind>,
}
impl fmt::Display for FrontendError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
self.context.fmt(f)
}
}
impl Fail for FrontendError {
fn cause(&self) -> Option<&Fail> {
self.context.cause()
}
fn backtrace(&self) -> Option<&Backtrace> {
self.context.backtrace()
}
}
impl ResponseError for FrontendError {
fn error_response(&self) -> HttpResponse {
HttpResponse::BadRequest().body(error(self).into_string())
}
}
#[derive(Clone, Copy, Debug, Eq, Fail, PartialEq)]
pub enum FrontendErrorKind {
#[fail(display = "Error generating client secret")]
Generation,
#[fail(display = "Error verifying client secret")]
Verification,
#[fail(display = "Error generating response body")]
Body,
#[fail(display = "Error generating response")]
Response,
#[fail(display = "Missing a required field")]
MissingField,
#[fail(display = "Invalid timezone")]
BadTimeZone,
#[fail(display = "Invalid year")]
BadYear,
#[fail(display = "Invalid month")]
BadMonth,
#[fail(display = "Invalid day")]
BadDay,
#[fail(display = "Invalid hour")]
BadHour,
#[fail(display = "Invalid minute")]
BadMinute,
#[fail(display = "Invalid second")]
BadSecond,
#[fail(display = "Could not find requested route")]
NoRoute,
#[fail(display = "Could not interact with session")]
Session,
#[fail(display = "Message from backend canceled")]
Canceled,
}
impl From<FrontendErrorKind> for FrontendError {
fn from(e: FrontendErrorKind) -> Self {
FrontendError {
context: Context::new(e),
}
}
}
impl From<Context<FrontendErrorKind>> for FrontendError {
fn from(e: Context<FrontendErrorKind>) -> Self {
FrontendError { context: e }
}
}
#[derive(Clone, Debug, Eq, Fail, PartialEq)]
#[fail(display = "Missing field {}", field)]
pub struct MissingField {
pub field: &'static str,
}