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
mod enforced_error;
mod generator;
mod traits;
use self::{
enforced_error::EnforcedErrors,
traits::{
GenerateCode,
GenerateCodeUsing,
},
};
use proc_macro2::TokenStream as TokenStream2;
pub trait CodeGenerator: Sized {
type Generator: From<Self> + GenerateCode;
}
impl<'a> CodeGenerator for &'a ir::Contract {
type Generator = generator::Contract<'a>;
}
impl<'a> CodeGenerator for &'a ir::InkTraitDefinition {
type Generator = generator::TraitDefinition<'a>;
}
impl<'a> CodeGenerator for &'a ir::InkTest {
type Generator = generator::InkTest<'a>;
}
impl<'a> CodeGenerator for &'a ir::ChainExtension {
type Generator = generator::ChainExtension<'a>;
}
impl<'a> CodeGenerator for &'a ir::SelectorMacro<ir::marker::SelectorId> {
type Generator = generator::SelectorId<'a>;
}
impl<'a> CodeGenerator for &'a ir::SelectorMacro<ir::marker::SelectorBytes> {
type Generator = generator::SelectorBytes<'a>;
}
impl<'a> CodeGenerator for &'a ir::Blake2x256Macro {
type Generator = generator::Blake2x256<'a>;
}
pub fn generate_code<T>(entity: T) -> TokenStream2
where
T: CodeGenerator,
{
<T as CodeGenerator>::Generator::from(entity).generate_code()
}