dmntk_macros/
lib.rs

1//! # Derive macros
2
3extern crate proc_macro;
4#[macro_use]
5extern crate quote;
6
7use proc_macro::TokenStream;
8
9#[proc_macro_derive(ToErrorMessage)]
10pub fn to_error_message(input: TokenStream) -> TokenStream {
11  let input = syn::parse_macro_input!(input as syn::DeriveInput);
12  let name = &input.ident;
13  let expanded = quote! {
14    impl ToErrorMessage for #name {
15      fn message(self) -> String {
16        self.0
17      }
18    }
19  };
20  TokenStream::from(expanded)
21}
22
23#[proc_macro_derive(DmnElement)]
24pub fn dmn_element(input: TokenStream) -> TokenStream {
25  let input = syn::parse_macro_input!(input as syn::DeriveInput);
26  let name = &input.ident;
27  let expanded = quote! {
28    impl DmnElement for #name {
29      fn namespace(&self) -> &str {
30        &self.namespace
31      }
32      fn id(&self) -> &String {
33        match &self.id {
34          DmnId::Provided(id) => id,
35          DmnId::Generated(id) => id,
36        }
37      }
38      fn opt_id(&self) -> Option<&String> {
39        match &self.id {
40          DmnId::Provided(id) => Some(&id),
41          DmnId::Generated(_) => None,
42        }
43      }
44      fn description(&self) -> &Option<String> {
45        &self.description
46      }
47      fn label(&self) -> &Option<String> {
48        &self.label
49      }
50      fn extension_elements(&self) -> &Vec<ExtensionElement> {
51        &self.extension_elements
52      }
53      fn extension_attributes(&self) -> &Vec<ExtensionAttribute> {
54        &self.extension_attributes
55      }
56    }
57  };
58  TokenStream::from(expanded)
59}
60
61#[proc_macro_derive(NamedElement)]
62pub fn named_element(input: TokenStream) -> TokenStream {
63  let input = syn::parse_macro_input!(input as syn::DeriveInput);
64  let name = &input.ident;
65  let expanded = quote! {
66    impl NamedElement for #name {
67      fn name(&self) -> &str {
68        &self.name
69      }
70      fn feel_name(&self) -> &Name {
71        &self.feel_name
72      }
73    }
74  };
75  TokenStream::from(expanded)
76}
77
78#[proc_macro_derive(BusinessContextElement)]
79pub fn business_context_element(input: TokenStream) -> TokenStream {
80  let input = syn::parse_macro_input!(input as syn::DeriveInput);
81  let name = &input.ident;
82  let expanded = quote! {
83    impl BusinessContextElement for #name {
84      fn uri(&self) -> &Option<String> {
85        &self.uri
86      }
87    }
88  };
89  TokenStream::from(expanded)
90}
91
92#[proc_macro_derive(Expression)]
93pub fn expression(input: TokenStream) -> TokenStream {
94  let input = syn::parse_macro_input!(input as syn::DeriveInput);
95  let name = &input.ident;
96  let expanded = quote! {
97    impl Expression for #name {
98      fn type_ref(&self) -> &Option<String> {
99        &self.type_ref
100      }
101    }
102  };
103  TokenStream::from(expanded)
104}