Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add impl From<VARIANTS> for Contract{Exec,Query,Sudo}Msg #376

Open
ethanfrey opened this issue May 9, 2024 · 1 comment
Open

Add impl From<VARIANTS> for Contract{Exec,Query,Sudo}Msg #376

ethanfrey opened this issue May 9, 2024 · 1 comment
Milestone

Comments

@ethanfrey
Copy link
Member

ethanfrey commented May 9, 2024

This is needed for full cw-orch codegen support #374 but is actually independent of cw-orch and could be a useful helper in any case. In order to explain what I request, I will use the cw20_base contract from the sylvia repo as an example. If we look at cw20_base::contract::sv::ContractExecMsg, the codegen is:

pub enum ContractExecMsg {
    Allowances(<cw20_allowances::sv::Api as InterfaceApi>::Exec),
    Marketing(<cw20_marketing::sv::Api as InterfaceApi>::Exec),
    Minting(<cw20_minting::sv::Api as InterfaceApi>::Exec),
    Cw20Base(ExecMsg),
}

Thanks to the regular generation of Sylvia code, this is always equivalent to:

pub enum ContractExecMsg {
    Allowances(cw20_allowances::sv::Cw20AllowancesExecMsg),
    Marketing(cw20_marketing::sv::Cw20MarketingExecMsg),
    Minting(cw20_minting::sv::Cw20MintingExecMsg),
    Cw20Base(ExecMsg),
}

You cannot implement the from on those associated types without the compiler yelling at you about conflicting From implementations. So the second version is much easier to work with. Given that, I would like Sylvia to generate the following implementations:

impl From<cw20_allowances::sv::Cw20AllowancesExecMsg> for ContractExecMsg {
    fn from(msg: cw20_allowances::sv::Cw20AllowancesExecMsg) -> Self {
        ContractExecMsg::Allowances(msg)
    }
}

impl From<cw20_marketing::sv::Cw20MarketingExecMsg> for ContractExecMsg {
    fn from(msg: cw20_marketing::sv::Cw20MarketingExecMsg) -> Self {
        ContractExecMsg::Marketing(msg)
    }
}

impl From<cw20_minting::sv::Cw20MintingExecMsg> for ContractExecMsg {
    fn from(msg: cw20_minting::sv::Cw20MintingExecMsg) -> Self {
        ContractExecMsg::Minting(msg)
    }
}

impl From<ExecMsg> for ContractExecMsg {
    fn from(msg: ExecMsg) -> Self {
        ContractExecMsg::Cw20Base(msg)
    }
}

And of course the same for *QueryMsg and *SudoMsg as well. This will allow easier programmatic usage of the concrete dispatched types for those "going under the hood" of Sylvia a bit. Again, cw-orch has this concrete need, but I don't see the issue of adding this code in general, not under any feature flag. An implementation to generate the last item could be found in #375. Generating the From for the interface messages was harder and lead to the stack overflow issue.

Note: Requested for the cosmwasm-1.x branch (and ported to / backported from main)

Pinging @jawoznia for your thoughts here

@hashedone
Copy link
Collaborator

Those impls could be there, but we do not generate them as eventually, those messages should never need to be created directly, the user should create them with #130.
However, executors are not yet implemented, and I believe this would be an easy addition and not harm us in any way. Added to 1.1.0 milestone.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants