1use std::error::Error;
2use std::fmt;
3
4use serde::{Deserialize, Serialize};
5
6#[macro_export]
7macro_rules! meta {
8 ($name: expr) => {
9 Meta {
10 name: $name.to_string(),
11 message: "".to_string(),
12 error: None,
13 }
14 .into()
15 };
16 ($name: expr, $message: expr) => {
17 Meta {
18 name: $name.to_string(),
19 message: $message.to_string(),
20 error: None,
21 }
22 .into()
23 };
24 ($name: expr, $message: expr, $error: expr) => {
25 Meta {
26 name: $name.to_string(),
27 message: $message.to_string(),
28 error: Some(Box::new($error)),
29 }
30 .into()
31 };
32}
33
34pub type R<T> = std::result::Result<T, Meta>;
35
36#[derive(Debug, Serialize, Deserialize)]
37pub struct Meta {
38 pub name: String,
39 pub message: String,
40 #[serde(skip)]
41 pub error: Option<Box<dyn Error>>,
42}
43
44unsafe impl Send for Meta {}
45
46unsafe impl Sync for Meta {}
47
48impl Error for Meta {}
49
50impl fmt::Display for Meta {
51 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
52 write!(f, "Meta: name={}, message={}", self.name, self.message)
53 }
54}