sylvia_derive/contract/communication/
instantiate_builder.rs1use 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}