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
/// Defines a simple ServiceProvider.
///
/// ```
/// # #[macro_use] extern crate monto;
/// simple_service_provider! {
///     name = Example;
///     product = errors;
///     language = text;
///     (path, input) => {
///         unimplemented!();
///     }
/// }
/// # fn main() {}
/// ```
#[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) };
}