1#![doc(
34 html_logo_url = "https://use.ink/img/crate-docs/logo.png",
35 html_favicon_url = "https://use.ink/crate-docs/favicon.png"
36)]
37
38pub use ink_primitives::{
39 abi::Abi,
40 reflect,
41};
42mod enforced_error;
43mod generator;
44mod traits;
45
46pub use generator::generate_type_spec;
47
48use self::{
49 enforced_error::EnforcedErrors,
50 traits::{
51 GenerateCode,
52 GenerateCodeUsing,
53 },
54};
55use proc_macro2::TokenStream as TokenStream2;
56
57pub trait CodeGenerator: Sized {
59 type Generator: From<Self> + GenerateCode;
61}
62
63impl<'a> CodeGenerator for &'a ir::Contract {
64 type Generator = generator::Contract<'a>;
65}
66
67impl<'a> CodeGenerator for &'a ir::Event {
68 type Generator = generator::Event<'a>;
69}
70
71impl<'a> CodeGenerator for &'a ir::StorageItem {
72 type Generator = generator::StorageItem<'a>;
73}
74
75impl<'a> CodeGenerator for &'a ir::InkTraitDefinition {
76 type Generator = generator::TraitDefinition<'a>;
77}
78
79impl<'a> CodeGenerator for (&'a ir::InkTraitDefinition, Option<Abi>) {
80 type Generator = generator::TraitDefinition<'a>;
81}
82
83impl<'a> CodeGenerator for &'a ir::InkTest {
84 type Generator = generator::InkTest<'a>;
85}
86
87impl<'a> CodeGenerator for &'a ir::SelectorMacro<ir::marker::SelectorId> {
88 type Generator = generator::SelectorId<'a>;
89}
90
91impl<'a> CodeGenerator for &'a ir::SelectorMacro<ir::marker::SelectorBytes> {
92 type Generator = generator::SelectorBytes<'a>;
93}
94
95impl<'a> CodeGenerator for &'a ir::Blake2x256Macro {
96 type Generator = generator::Blake2x256<'a>;
97}
98
99pub fn generate_code<T>(entity: T) -> TokenStream2
101where
102 T: CodeGenerator,
103{
104 <T as CodeGenerator>::Generator::from(entity).generate_code()
105}