Skip to content

[Bug]: Rust-analyzer's "implement missing members" for ResourceBuilder creates over-complicated code #923

Open
@morlinbrot

Description

What happened?

Rust analyzer provides the handy feature of automatically implementing missing members of a trait. When doing this for ResourceBuilder, it will generate function signatures that are more complicated than actually needed. Example:

impl ResourceBuilder<MyResource> for MyResourceBuilder {
    // other stuff

    fn output<'life0, 'async_trait>(
        self,
        factory: &'life0 mut dyn shuttle_service::Factory,
    ) -> core::pin::Pin<
        Box<
            dyn core::future::Future<Output = Result<Self::Output, shuttle_service::Error>>
                + core::marker::Send
                + 'async_trait,
        >,
    >
    where
        'life0: 'async_trait,
        Self: 'async_trait,
    {
        todo!()
    }

    fn build<'life0, 'async_trait>(
        build_data: &'life0 Self::Output,
    ) -> core::pin::Pin<
        Box<
            dyn core::future::Future<Output = Result<SQLiteInstance, shuttle_service::Error>>
                + core::marker::Send
                + 'async_trait,
        >,
    >
    where
        'life0: 'async_trait,
        Self: 'async_trait,
    {
        todo!()
    }
}

This is due to the trait requiring async functions and async traits not yet being supported natively by Rust (The above is the actual representation of the trait in "pure" Rust as of now).

For an actual implementation, we're using the [async_trait] crate and the actual function signatures looking like so:

#[async_trait]
impl ResourceBuilder<MyResource> for MyResourceBuilder {
    // other stuff

    async fn output(self, factory: &mut dyn Factory) -> Result<Self::Output, shuttle_service::Error> {
        todo!()
    }

    /// Build this resource from its config output
    async fn build(build_data: &Self::Output) -> Result<MyResource, shuttle_service::Error> {
        todo!()
    }
}

Also see the example in the docs for a copy-pasteable example.

I don't think there's a solution to this right now but this may help somebody coming across this issue and finding the issue here. It may also be worth adding an explanation one-liner to the docs on this, let me know if I should do that.

Version

v0.15.0

Which operating systems are you seeing the problem on?

macOS

Which CPU architectures are you seeing the problem on?

ARM64

Relevant log output

No response

Duplicate declaration

  • I have searched the issues and there are none like this.

Metadata

Assignees

No one assigned

    Labels

    S-Not PlannedWe don't have any plans to work on thisT-BugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions