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
use crate::model::{AutoImpl, ContractTrait, Method, MethodImpl};
use super::{
auto_impl_event::{generate_event_impl, generate_legacy_event_impl},
auto_impl_proxy::generate_proxy_getter_impl,
auto_impl_storage::{
generate_clear_impl, generate_getter_impl, generate_is_empty_impl, generate_mapper_impl,
generate_setter_impl,
},
};
pub fn generate_auto_impls(contract: &ContractTrait) -> Vec<proc_macro2::TokenStream> {
contract
.methods
.iter()
.filter_map(|m| match &m.implementation {
MethodImpl::Explicit(_) => None,
MethodImpl::Generated(auto_impl) => Some(generate_auto_impl(m, auto_impl)),
MethodImpl::NoImplementation => {
panic!(
"method `{}` needs either an auto-implementation or a default implementation",
m.name.to_string()
)
},
})
.collect()
}
fn generate_auto_impl(m: &Method, auto_impl: &AutoImpl) -> proc_macro2::TokenStream {
match auto_impl {
AutoImpl::LegacyEvent { identifier } => {
generate_legacy_event_impl(m, identifier.as_slice())
},
AutoImpl::Event { identifier } => generate_event_impl(m, identifier),
AutoImpl::StorageGetter { identifier } => generate_getter_impl(m, identifier),
AutoImpl::StorageSetter { identifier } => generate_setter_impl(m, identifier),
AutoImpl::StorageMapper { identifier } => generate_mapper_impl(m, identifier),
AutoImpl::StorageIsEmpty { identifier } => generate_is_empty_impl(m, identifier),
AutoImpl::StorageClear { identifier } => generate_clear_impl(m, identifier),
AutoImpl::ProxyGetter => generate_proxy_getter_impl(m),
}
}