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
/// Defines a simple ServiceProvider.
///
/// ```
/// # #[macro_use] extern crate monto;
/// simple_service_provider! {
///     name = Example;
///     product = "errors";
///     language = "text";
///     (path, input) => {
///         unimplemented!();
///     }
/// }
///
/// simple_service_provider! {
///     name = OtherExample;
///     // Both of these are "custom".
///     product = "edu.umn.cs.melt.custom_product";
///     language = "ableC";
///     (path, input) => {
///         unimplemented!();
///     }
/// }
/// # fn main() {}
/// ```
#[macro_export]
macro_rules! simple_service_provider {
    (
        name = $name:ident;
        product = $product:expr;
        language = $lang:expr;
        ($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.parse().expect("Invalid product name from macro");
                let language = $lang.to_owned().into();
                $crate::common::messages::ProductDescriptor { name, language }
            }
            fn service(&mut self, $path: &str, $input: ::std::vec::Vec<$crate::common::messages::Product>) -> (::std::result::Result<$crate::Value, ::std::vec::Vec<$crate::service::messages::ServiceError>>, ::std::vec::Vec<$crate::service::messages::ServiceNotice>) $body
        }
    }
}