1extern 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}