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
#[macro_export]
macro_rules! simple_service_provider {
(
name = $name:ident;
product = $product:ident;
language = $lang:ident;
($path:ident, $input:ident) => $body:block
) => {
pub struct $name;
impl $crate::service::ServiceProvider for $name {
fn descriptor(&self) -> $crate::common::messages::ProductDescriptor {
let name = __product_name!($product);
let language = __product_lang!($lang);
$crate::common::messages::ProductDescriptor { name, language }
}
fn service(&mut self, $path: &str, $input: ::std::vec::Vec<$crate::common::messages::Product>) -> ::std::result::Result<$crate::service::messages::ServiceProduct, $crate::service::messages::ServiceErrors> $body
}
}
}
#[macro_export]
#[doc(hidden)]
macro_rules! __product_name {
(directory) => { $crate::common::messages::ProductName::Directory };
(errors) => { $crate::common::messages::ProductName::Errors };
(highlighting) => { $crate::common::messages::ProductName::Highlighting };
(source) => { $crate::common::messages::ProductName::Source };
($($n:ident .)+ $l:ident) => {{
let mut s = ::std::string::String::new();
$({
s.push_str(stringify!($n));
s.push('.');
})+
s.push_str(stringify!($l));
s.parse().expect("Invalid product name from a macro")
}};
}
#[macro_export]
#[doc(hidden)]
macro_rules! __product_lang {
(json) => { $crate::common::messages::Language::Json };
(none) => { $crate::common::messages::Language::None };
(text) => { $crate::common::messages::Language::Text };
($i:ident) => { $crate::common::messages::Language::from(stringify!($i).to_owned()) };
($e:expr) => { $crate::common::messages::Language::from($e) };
}