Skip to content

Commit

Permalink
feat: Generate sudo multitest helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
jawoznia committed Nov 24, 2023
1 parent 8243458 commit 24629f8
Show file tree
Hide file tree
Showing 5 changed files with 246 additions and 61 deletions.
71 changes: 42 additions & 29 deletions sylvia-derive/src/message.rs
Original file line number Diff line number Diff line change
Expand Up @@ -716,6 +716,16 @@ impl<'a> MsgVariant<'a> {
.map_err(Into::into)
}
},
MsgType::Sudo => quote! {
pub fn #name (&self, #(#params,)* ) -> Result< #sylvia ::cw_multi_test::AppResponse, #error_type> {
let msg = #enum_name :: #name ( #(#arguments),* );

(*self.app)
.app_mut()
.wasm_sudo(self.contract_addr.clone(), &msg)
.map_err(|err| err.downcast().unwrap())
}
},
_ => quote! {},
}
}
Expand Down Expand Up @@ -768,6 +778,16 @@ impl<'a> MsgVariant<'a> {
.map_err(Into::into)
}
},
MsgType::Sudo => quote! {
fn #name (&self, #(#params,)* ) -> Result< #sylvia ::cw_multi_test::AppResponse, #error_type> {
let msg = #interface_enum :: #type_name :: #name ( #(#arguments),* );

(*self.app)
.app_mut()
.wasm_sudo(self.contract_addr.clone(), &msg)
.map_err(|err| err.downcast().unwrap())
}
},
_ => quote! {},
}
}
Expand Down Expand Up @@ -798,6 +818,9 @@ impl<'a> MsgVariant<'a> {
MsgType::Query => quote! {
fn #name (&self, #(#params,)* ) -> Result<#return_type, #error_type>;
},
MsgType::Sudo => quote! {
fn #name (&self, #(#params,)* ) -> Result< #sylvia ::cw_multi_test::AppResponse, #error_type>;
},
_ => quote! {},
}
}
Expand Down Expand Up @@ -1695,20 +1718,25 @@ impl<'a> EntryPoints<'a> {

#[cfg(not(tarpaulin_include))]
{
let entry_points = [instantiate_variants, exec_variants, query_variants]
.into_iter()
.map(
|variants| match override_entry_points.get_entry_point(variants.msg_ty) {
Some(_) => quote! {},
None => variants.emit_default_entry_point(
&custom_msg,
&custom_query,
name,
error,
&attrs.generics,
),
},
);
let entry_points = [
instantiate_variants,
exec_variants,
query_variants,
sudo_variants,
]
.into_iter()
.map(|variants| {
match override_entry_points.get_entry_point(variants.msg_ty) {
Some(_) => quote! {},
None => variants.emit_default_entry_point(
&custom_msg,
&custom_query,
name,
error,
&attrs.generics,
),
}
});

let migrate_not_overridden = override_entry_points
.get_entry_point(MsgType::Migrate)
Expand Down Expand Up @@ -1744,19 +1772,6 @@ impl<'a> EntryPoints<'a> {
_ => quote! {},
});

let sudo = override_entry_points
.get_entry_point(MsgType::Sudo)
.map(|_| quote! {})
.unwrap_or_else(|| {
sudo_variants.emit_default_entry_point(
&custom_msg,
&custom_query,
name,
error,
&attrs.generics,
)
});

quote! {
pub mod entry_points {
use super::*;
Expand All @@ -1766,8 +1781,6 @@ impl<'a> EntryPoints<'a> {
#migrate

#reply_ep

#sudo
}
}
}
Expand Down
37 changes: 26 additions & 11 deletions sylvia-derive/src/multitest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ pub struct MultitestHelpers<'a, Generics> {
query_variants: MsgVariants<'a, Generics>,
migrate_variants: MsgVariants<'a, Generics>,
reply_variants: MsgVariants<'a, Generics>,
sudo_variants: MsgVariants<'a, Generics>,
}

impl<'a, Generics> MultitestHelpers<'a, Generics>
Expand All @@ -77,6 +78,8 @@ where
MsgVariants::new(source.as_variants(), MsgType::Exec, generics, where_clause);
let query_variants =
MsgVariants::new(source.as_variants(), MsgType::Query, generics, where_clause);
let sudo_variants =
MsgVariants::new(source.as_variants(), MsgType::Sudo, generics, where_clause);
let migrate_variants = MsgVariants::new(
source.as_variants(),
MsgType::Migrate,
Expand Down Expand Up @@ -139,6 +142,7 @@ where
instantiate_variants,
exec_variants,
query_variants,
sudo_variants,
migrate_variants,
reply_variants,
}
Expand All @@ -154,6 +158,7 @@ where
exec_variants,
query_variants,
migrate_variants,
sudo_variants,
generics,
where_clause,
..
Expand Down Expand Up @@ -184,6 +189,8 @@ where
exec_variants.emit_multitest_proxy_methods(&custom_msg, &mt_app, error_type);
let query_methods =
query_variants.emit_multitest_proxy_methods(&custom_msg, &mt_app, error_type);
let sudo_methods =
sudo_variants.emit_multitest_proxy_methods(&custom_msg, &mt_app, error_type);
let migrate_methods =
migrate_variants.emit_multitest_proxy_methods(&custom_msg, &mt_app, error_type);
let where_predicates = where_clause
Expand Down Expand Up @@ -239,6 +246,7 @@ where
#( #exec_methods )*
#( #migrate_methods )*
#( #query_methods )*
#( #sudo_methods )*
#( #proxy_accessors )*
}

Expand Down Expand Up @@ -288,14 +296,14 @@ where
generics,
exec_variants,
query_variants,
sudo_variants,
..
} = self;

let sylvia = crate_module();

let interface_name = interface_name(self.source);
let proxy_name = &self.proxy_name;
let trait_name = Ident::new(&format!("{}", interface_name), interface_name.span());

let module = interfaces
.get_only_interface()
Expand Down Expand Up @@ -340,26 +348,36 @@ where
generics,
&module,
);
let sudo_methods = sudo_variants.emit_interface_multitest_proxy_methods(
&custom_msg,
&mt_app,
error_type,
generics,
&module,
);
let exec_methods_declarations =
exec_variants.emit_proxy_methods_declarations(&custom_msg, error_type, &interface_enum);
let query_methods_declarations = query_variants.emit_proxy_methods_declarations(
&custom_msg,
error_type,
&interface_enum,
);
let sudo_methods_declarations =
sudo_variants.emit_proxy_methods_declarations(&custom_msg, error_type, &interface_enum);

#[cfg(not(tarpaulin_include))]
{
quote! {
pub mod test_utils {
use super::*;

pub trait #trait_name<MtApp> {
pub trait #interface_name <MtApp> {
#(#query_methods_declarations)*
#(#exec_methods_declarations)*
#(#sudo_methods_declarations)*
}

impl<BankT, ApiT, StorageT, CustomT, WasmT, StakingT, DistrT, IbcT, GovT> #trait_name< #mt_app > for #module sv::trait_utils:: #proxy_name<'_, #mt_app >
impl<BankT, ApiT, StorageT, CustomT, WasmT, StakingT, DistrT, IbcT, GovT> #interface_name < #mt_app > for #module sv::trait_utils:: #proxy_name<'_, #mt_app >
where
CustomT: #sylvia ::cw_multi_test::Module,
WasmT: #sylvia ::cw_multi_test::Wasm<CustomT::ExecT, CustomT::QueryT>,
Expand All @@ -382,6 +400,7 @@ where
{
#(#query_methods)*
#(#exec_methods)*
#(#sudo_methods)*
}
}
}
Expand Down Expand Up @@ -562,6 +581,7 @@ where
instantiate_variants,
exec_variants,
query_variants,
sudo_variants,
migrate_variants,
reply_variants,
..
Expand All @@ -570,6 +590,7 @@ where

let bracketed_generics = emit_bracketed_generics(generics);
let full_where_clause = &source.generics.where_clause;

let instantiate_body = override_entry_points
.get_entry_point(MsgType::Instantiate)
.map(OverrideEntryPoint::emit_multitest_dispatch)
Expand All @@ -588,20 +609,14 @@ where
let sudo_body = override_entry_points
.get_entry_point(MsgType::Sudo)
.map(OverrideEntryPoint::emit_multitest_dispatch)
.unwrap_or_else(|| {
quote! {
#sylvia ::anyhow::bail!("sudo not implemented for contract")
}
});
.unwrap_or_else(|| sudo_variants.emit_multitest_default_dispatch());

let migrate_body = match override_entry_points.get_entry_point(MsgType::Migrate) {
Some(entry_point) => entry_point.emit_multitest_dispatch(),
None if migrate_variants.get_only_variant().is_some() => {
migrate_variants.emit_multitest_default_dispatch()
}
None => quote! {
#sylvia ::anyhow::bail!("migrate not implemented for contract")
},
None => quote! { #sylvia ::anyhow::bail!("migrate not implemented for contract") },
};

let reply_body = match override_entry_points.get_entry_point(MsgType::Reply) {
Expand Down
Loading

0 comments on commit 24629f8

Please sign in to comment.