sylvia_derive/contract/communication/
instantiate_builder.rs

1use convert_case::Case;
2use proc_macro2::{Ident, TokenStream};
3use quote::quote;
4use syn::{GenericParam, Type, WhereClause};
5
6use crate::crate_module;
7use crate::parser::MsgType;
8use crate::types::msg_variant::MsgVariant;
9use crate::utils::{get_ident_from_type, SvCasing};
10
11pub struct InstantiateBuilder<'a> {
12    contract: Type,
13    used_generics: &'a [&'a GenericParam],
14    where_clause: &'a Option<WhereClause>,
15    instantiate_variant: &'a MsgVariant<'a>,
16}
17
18impl<'a> InstantiateBuilder<'a> {
19    pub fn new(
20        contract: Type,
21        used_generics: &'a [&'a syn::GenericParam],
22        where_clause: &'a Option<WhereClause>,
23        instantiate_variant: &'a MsgVariant<'a>,
24    ) -> Self {
25        Self {
26            contract,
27            used_generics,
28            where_clause,
29            instantiate_variant,
30        }
31    }
32
33    pub fn emit(&self) -> TokenStream {
34        let sylvia = crate_module();
35        let Self {
36            contract,
37            used_generics,
38            where_clause,
39            instantiate_variant,
40        } = self;
41
42        let contract_name = get_ident_from_type(contract);
43        let msg_type = MsgType::Instantiate;
44
45        let trait_name = Ident::new(
46            &format!("{}InstantiateBuilder", &contract_name.to_string()),
47            contract_name.span(),
48        );
49        let method_name = contract_name.to_case(Case::Snake);
50        let fields_names = instantiate_variant.as_fields_names();
51        let parameters = instantiate_variant.emit_method_field();
52        let msg_name = msg_type.emit_msg_name();
53
54        quote! {
55            pub trait #trait_name {
56                fn #method_name < #(#used_generics),* > (code_id: u64, #(#parameters),* ) -> #sylvia ::cw_std::StdResult < #sylvia ::builder::instantiate::InstantiateBuilder> #where_clause;
57            }
58
59            impl #trait_name for #sylvia ::builder::instantiate::InstantiateBuilder {
60                fn #method_name < #(#used_generics),* > (code_id: u64, #(#parameters,)* ) -> #sylvia ::cw_std::StdResult< #sylvia ::builder::instantiate::InstantiateBuilder> #where_clause {
61                    let msg = #msg_name ::< #(#used_generics),* > ::new( #(#fields_names),* );
62                    let msg = #sylvia ::cw_std::to_json_binary(&msg)?;
63                    Ok( #sylvia ::builder::instantiate::InstantiateBuilder::new(msg, code_id))
64                }
65            }
66        }
67    }
68}