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
mod generator;
mod traits;
use self::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::InkTrait {
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>;
}
pub fn generate_code<T>(entity: T) -> TokenStream2
where
T: CodeGenerator,
{
<T as CodeGenerator>::Generator::from(entity).generate_code()
}