Skip to content

Support generics in generated export! macro in Rust #1564

Description

@tqwewe

The wit_bindgen::generate! macro generates a export! macro which has the following syntax supported:

    ($ty:ident) => ...;
    ($ty:ident with_types_in $($path_to_types_root:tt)*) => ...;

Since $ty is an ident only, it means I'm unable to pass in a path or type with generics, which is quite limiting.

My use case is something like this:

#[macro_export]
macro_rules! export_projection {
    ($ty:path) => {
        $crate::runtime::projection::export!(
            $crate::runtime::projection::Projection<$ty> with_types_in $crate::runtime::projection
        );
    };
}
pub struct Projection<T>(PhantomData<T>);

pub struct ProjectionState<T> {
    inner: RefCell<T>,
}

impl<T: EventHandler + 'static> Guest for Projection<T> {
    type ProjectionState = ProjectionState<T>;
}

impl<T: EventHandler + 'static> GuestProjectionState for ProjectionState<T> {
    ...
}

But with the export! macro only accepting an ident, it becomes problematic.

I've experimented with simply changing wit_bindgen to use path instead of ident, which seems to work no problem. The only issue is with_types_in isn't supported here, so it needs to be changed to something like $ty => $path_to_types_root.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions