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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
use crate::template::Template as TransactionTemplate;
#[macro_use]
pub mod macros;
pub mod actions;
pub mod compiler;
pub mod error;
pub mod object;
pub use error::CompilationError;
pub mod context;
pub use context::Context;
use bitcoin::util::amount::Amount;
pub use compiler::Compilable;
pub use object::Object as Compiled;
pub type TxTmplIt = Result<
Box<dyn Iterator<Item = Result<TransactionTemplate, CompilationError>>>,
CompilationError,
>;
pub trait Contract
where
Self: Sized + 'static,
Option<Self::StatefulArguments>: Default,
{
declare! {then}
declare! { updatable<> }
declare! {finish}
}
pub struct DynamicContract<'a, T, S>
where
S: 'a,
{
pub then: Vec<fn() -> Option<actions::ThenFunc<'a, S>>>,
pub finish_or: Vec<fn() -> Option<actions::FinishOrFunc<'a, S, T>>>,
pub finish: Vec<fn() -> Option<actions::Guard<S>>>,
pub data: S,
}
impl<T, S> AnyContract for DynamicContract<'_, T, S> {
type StatefulArguments = T;
type Ref = S;
fn then_fns<'a>(&'a self) -> &'a [fn() -> Option<actions::ThenFunc<'a, S>>]
where
Self::Ref: 'a,
{
&self.then[..]
}
fn finish_or_fns<'a>(
&'a self,
) -> &'a [fn() -> Option<actions::FinishOrFunc<'a, S, Self::StatefulArguments>>] {
&self.finish_or[..]
}
fn finish_fns<'a>(&'a self) -> &'a [fn() -> Option<actions::Guard<S>>] {
&self.finish[..]
}
fn get_inner_ref<'a>(&self) -> &Self::Ref {
&self.data
}
}
pub trait AnyContract
where
Self: Sized,
{
type StatefulArguments;
type Ref;
fn then_fns<'a>(&'a self) -> &'a [fn() -> Option<actions::ThenFunc<'a, Self::Ref>>]
where
Self::Ref: 'a;
fn finish_or_fns<'a>(
&'a self,
) -> &'a [fn() -> Option<actions::FinishOrFunc<'a, Self::Ref, Self::StatefulArguments>>];
fn finish_fns<'a>(&'a self) -> &'a [fn() -> Option<actions::Guard<Self::Ref>>];
fn get_inner_ref<'a>(&'a self) -> &'a Self::Ref;
}
impl<C> AnyContract for C
where
C: Contract + Sized,
{
type StatefulArguments = C::StatefulArguments;
type Ref = Self;
fn then_fns<'a>(&'a self) -> &'a [fn() -> Option<actions::ThenFunc<'a, Self::Ref>>]
where
Self::Ref: 'a,
{
Self::THEN_FNS
}
fn finish_or_fns<'a>(
&'a self,
) -> &'a [fn() -> Option<actions::FinishOrFunc<'a, Self::Ref, Self::StatefulArguments>>] {
Self::FINISH_OR_FUNCS
}
fn finish_fns<'a>(&'a self) -> &'a [fn() -> Option<actions::Guard<Self::Ref>>] {
Self::FINISH_FNS
}
fn get_inner_ref<'a>(&'a self) -> &Self::Ref {
self
}
}