1macro_rules! trait_method {
2 ($name:ident: $kind:ty, $default:ident) => (
3 fn $name(&mut self, value: $kind) -> Result<FnOutput> {
4 $default(self, value)
5 }
6 )
7}
8
9macro_rules! trait_forward {
10 (<$T:ident as $Trait:ident>::$name:ident: $kind:ty) => (
11 fn $name(&mut self, value: $kind) -> Result<FnOutput> {
12 <$T as $Trait>::$name(self, value)
13 }
14 )
15}
16
17macro_rules! function {
18 ($kind:ty) => (Option<Box<dyn FnMut(&mut Self, $kind) -> Result<FnOutput>>>)
19}
20
21macro_rules! builder {
22 ($name:ident: $kind:ty, $field:ident) => (
23 pub fn $name<F>(mut self, mut f: F) -> Self
24 where F: FnMut(&mut Self, $kind) -> FnOutput + 'static
25 {
26 self.$field = Some(Box::new(move |s, v| Ok(f(s, v))));
27 self
28 }
29 )
30}
31
32macro_rules! try_builder {
33 ($try_name:ident: $kind:ty, $field:ident) => (
34 pub fn $try_name<F>(mut self, f: F) -> Self
35 where F: FnMut(&mut Self, $kind) -> Result<FnOutput> + 'static
36 {
37 self.$field = Some(Box::new(f));
38 self
39 }
40 )
41}
42
43macro_rules! builder_forward {
44 ($name:ident : $kind:ty, $field:ident, $default:expr) => (
45 fn $name(&mut self, value: $kind) -> Result<FnOutput> {
46 match self.$field.take() {
47 Some(mut f) => {
48 let result = f(self, value);
49 self.$field = Some(f);
50 result
51 }
52 None => $default(&mut *self, value)
53 }
54 }
55 )
56}
57
58macro_rules! builder_def_fwd {
59 ($name:ident : $kind:ty, $field:ident, $default:expr) => (
60 fn $name(&mut self, value: $kind) -> Result<FnOutput> {
61 if let Some(mut f) = self.$field.take() {
62 let result = f(self, value);
63 self.$field = Some(f);
64 result?;
65 }
66
67 $default(&mut *self, value)
68 }
69 )
70}