Skip to content
This repository has been archived by the owner on May 21, 2024. It is now read-only.

Framework generic parameter deduction fails with type alias #27

Open
kangalio opened this issue Feb 22, 2021 · 1 comment
Open

Framework generic parameter deduction fails with type alias #27

kangalio opened this issue Feb 22, 2021 · 1 comment
Labels
bug Something isn't working

Comments

@kangalio
Copy link
Contributor

Code like this can be successfully processed by the #[command] proc-macro:

#[command]
pub async fn some_command(ctx: FrameworkContext<Data>, msg: &Message) {}

However, code like this fails:

type Context = FrameworkContext<Data>;

#[command]
pub async fn some_command(ctx: Context, msg: &Message) {}

Error:

error[E0308]: mismatched types
  --> src/crates.rs:42:1
   |
42 | #[command]
   | ^^^^^^^^^^
   | |
   | expected `()`, found struct `Data`
   | expected `serenity_framework::command::Command` because of return type
   |
   = note: expected struct `serenity_framework::command::Command<()>`
              found struct `serenity_framework::command::Command<Data>`

I think the reason for this failure is that #[command] attempts to deduce the user data type by parsing generic parameters of the ctx function argument. Because of the type alias, it can't find any generic parameters and falsely thinks this function uses the default user data (()).

If this suspicion is correct, the issue can be worked around something like this:

// Inside framework crate
pub struct Context<D = DefaultData, E = DefaultError> {
    // ...
}

#[doc(hidden)]
pub trait _ContextTypes {
    type D;
    type E;
}

impl<D, E> _ContextTypes for Context<D, E> {
    type D = D;
    type E = E;
}

The command_attr crate then uses <ARGUMENTTYPE as _ContextTypes>::D and <ARGUMENTTYPE as _ContextTypes>::E instead of trying to deduce the generic parameters from ARGUMENTTYPE.

@arqunis arqunis added the bug Something isn't working label Feb 22, 2021
@kangalio
Copy link
Contributor Author

I have successfully fixed this in my local framework fork. It's based upon #25 so I haven't created a PR yet (that would be a little messy, a PR blocked on a draft PR blocked on a PR in a different repository). Just thought I'd mention to prevent duplicate efforts

kangalio added a commit to kangalio/framework that referenced this issue Feb 23, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants