odra_codegen/generator/module_impl/deploy/
deployer_casper_test.rs

1use odra_ir::module::Constructor;
2use proc_macro2::{Ident, TokenStream};
3use quote::quote;
4
5use crate::generator::module_impl::deploy::common;
6
7use super::args_to_runtime_args_stream;
8
9pub fn generate_code(
10    struct_ident: &Ident,
11    deployer_ident: &Ident,
12    ref_ident: &Ident,
13    constructors: &[&Constructor]
14) -> TokenStream {
15    let constructors = build_constructors(constructors, struct_ident, ref_ident);
16
17    quote! {
18        impl #deployer_ident {
19            #constructors
20        }
21    }
22}
23
24fn build_constructors(
25    constructors: &[&Constructor],
26    struct_ident: &Ident,
27    ref_ident: &Ident
28) -> TokenStream {
29    if constructors.is_empty() {
30        build_default_constructor(struct_ident, ref_ident)
31    } else {
32        constructors
33            .iter()
34            .map(|constructor| build_constructor(constructor, struct_ident, ref_ident))
35            .collect::<TokenStream>()
36    }
37}
38
39fn build_default_constructor(struct_ident: &Ident, ref_ident: &Ident) -> TokenStream {
40    let struct_name = struct_ident.to_string();
41    let struct_name_snake_case = odra_utils::camel_to_snake(&struct_name);
42
43    quote! {
44        pub fn default() -> #ref_ident {
45            let address = odra::test_env::register_contract(&#struct_name_snake_case, &odra::types::casper_types::RuntimeArgs::new(), None);
46            #ref_ident::at(&address)
47        }
48    }
49}
50
51fn build_constructor(
52    constructor: &Constructor,
53    struct_ident: &Ident,
54    ref_ident: &Ident
55) -> TokenStream {
56    let struct_name = struct_ident.to_string();
57    let struct_name_snake_case = odra_utils::camel_to_snake(&struct_name);
58    let constructor_ident = &constructor.ident;
59
60    let fn_sig = common::constructor_sig(constructor, ref_ident);
61    let args = args_to_runtime_args_stream(&constructor.args);
62
63    quote! {
64        pub #fn_sig {
65            let args = { #args };
66            let constructor = odra::prelude::string::String::from(stringify!(#constructor_ident));
67            let address = odra::test_env::register_contract(#struct_name_snake_case, &args, Some(constructor));
68            #ref_ident::at(&address)
69        }
70    }
71}