1use log::{debug, error, info, trace, warn};
2
3pub trait ResultLogger<F> {
4 fn log_trace(self, target: &str, cb: F) -> Self;
5 fn log_debug(self, target: &str, cb: F) -> Self;
6 fn log_info(self, target: &str, cb: F) -> Self;
7 fn log_warn(self, target: &str, cb: F) -> Self;
8 fn log_error(self, target: &str, cb: F) -> Self;
9 fn print_error(self, cb: F) -> Self;
10}
11
12impl<F, S, T, E> ResultLogger<F> for std::result::Result<T, E>
13where
14 S: AsRef<str>,
15 F: FnOnce(&E) -> S,
16{
17 fn log_trace(self, target: &str, cb: F) -> Self {
18 return self.map_err(|e| {
19 trace!(target: target, "{}", cb(&e).as_ref());
20 e
21 });
22 }
23
24 fn log_debug(self, target: &str, cb: F) -> Self {
25 return self.map_err(|e| {
26 debug!(target: target, "{}", cb(&e).as_ref());
27 e
28 });
29 }
30
31 fn log_info(self, target: &str, cb: F) -> Self {
32 return self.map_err(|e| {
33 info!(target: target, "{}", cb(&e).as_ref());
34 e
35 });
36 }
37
38 fn log_warn(self, target: &str, cb: F) -> Self {
39 return self.map_err(|e| {
40 warn!(target: target, "{}", cb(&e).as_ref());
41 e
42 });
43 }
44
45 fn log_error(self, target: &str, cb: F) -> Self {
46 return self.map_err(|e| {
47 error!(target: target, "{}", cb(&e).as_ref());
48 e
49 });
50 }
51
52 fn print_error(self, cb: F) -> Self {
53 return self.map_err(|e| {
54 println!("{}", cb(&e).as_ref());
55 e
56 });
57 }
58}
59
60impl<F, S, T> ResultLogger<F> for Option<T>
61where
62 S: AsRef<str>,
63 F: FnOnce() -> S,
64{
65 fn log_trace(self, target: &str, cb: F) -> Self {
66 if self.is_none() {
67 trace!(target: target, "{}", cb().as_ref())
68 }
69 self
70 }
71
72 fn log_debug(self, target: &str, cb: F) -> Self {
73 if self.is_none() {
74 debug!(target: target, "{}", cb().as_ref())
75 }
76 self
77 }
78
79 fn log_info(self, target: &str, cb: F) -> Self {
80 if self.is_none() {
81 info!(target: target, "{}", cb().as_ref())
82 }
83 self
84 }
85
86 fn log_warn(self, target: &str, cb: F) -> Self {
87 if self.is_none() {
88 warn!(target: target, "{}", cb().as_ref())
89 }
90 self
91 }
92
93 fn log_error(self, target: &str, cb: F) -> Self {
94 if self.is_none() {
95 error!(target: target, "{}", cb().as_ref())
96 }
97 self
98 }
99
100 fn print_error(self, cb: F) -> Self {
101 if self.is_none() {
102 println!("{}", cb().as_ref())
103 }
104 self
105 }
106}
107
108#[macro_export]
109macro_rules! default_from_serde {
110 ($struct_name:ident) => {
111 impl Default for $struct_name {
112 fn default() -> Self {
113 serde_json::from_value(serde_json::json!({})).unwrap()
114 }
115 }
116
117 impl $struct_name {
118 pub fn new() -> Self {
119 Default::default()
120 }
121 }
122 };
123}