fuxiaohei opened issue #5688:
Wit code:
interface http-types{ // request object record request{ method:string } // response object record response{} } default world http-interface { export http-handler: interface { use self.http-types.{request,response} handle-request: func(request: request) -> response } import http-fetch: interface { use self.http-types.{request,response} fetch-request: func(request: request) -> response } }
Rust code
wasmtime::component::bindgen!({ world: "http-interface", path: "http-interface.wit", async: true, });
Error:
this struct takes 0 lifetime arguments but 1 lifetime argument was supplied expected 0 lifetime arguments
Some expanded code maybe:
pub mod http_types { #[allow(unused_imports)] use wasmtime::component::__internal::anyhow; #[component(record)] pub struct Response {} #[component(record)] pub struct Request { #[component(name = "method")] pub method: String, } .... pub mod http_fetch { #[allow(unused_imports)] use wasmtime::component::__internal::anyhow; pub type Request = super::http_types::Request; pub type Response = super::http_types::Response; pub trait HttpFetch: Sized { #[must_use] #[allow(clippy::type_complexity, clippy::type_repetition_in_bounds)] fn fetch_request<'life0, 'async_trait>( &'life0 mut self, request: Request, ) -> ::core::pin::Pin< Box< dyn ::core::future::Future< Output = anyhow::Result<Response>, > + ::core::marker::Send + 'async_trait, >, > where 'life0: 'async_trait, Self: 'async_trait; } pub mod http_handler { #[allow(unused_imports)] use wasmtime::component::__internal::anyhow; pub type Request<'a> = super::http_types::Request<'a>; // <-- error message show on this line pub type Response = super::http_types::Response; pub struct HttpHandler { handle_request: wasmtime::component::Func, } impl HttpHandler { pub fn new( __exports: &mut wasmtime::component::ExportInstance<'_, '_>, ) -> anyhow::Result<HttpHandler> { let handle_request = *__exports .typed_func::<(Request<'_>,), (Response,)>("handle-request")? .func(); Ok(HttpHandler { handle_request }) } pub async fn handle_request<S: wasmtime::AsContextMut>( &self, mut store: S, arg0: Request<'_>, ) -> anyhow::Result<Response> where <S as wasmtime::AsContext>::Data: Send, { let callee = unsafe { wasmtime::component::TypedFunc::< (Request<'_>,), (Response,), >::new_unchecked(self.handle_request) }; let (ret0,) = callee.call_async(store.as_context_mut(), (arg0,)).await?; callee.post_return_async(store.as_context_mut()).await?; Ok(ret0) } } } }
It seems that
method:string
inrecord request
affects this case. ifrecord request{}
with no fields, it generatespub type Request = super::http_types::Request
without lifetime mark.
alexcrichton commented on issue #5688:
Thanks for the report! I've posted a fix for this at https://github.com/bytecodealliance/wasmtime/pull/5692
alexcrichton closed issue #5688:
Wit code:
interface http-types{ // request object record request{ method:string } // response object record response{} } default world http-interface { export http-handler: interface { use self.http-types.{request,response} handle-request: func(request: request) -> response } import http-fetch: interface { use self.http-types.{request,response} fetch-request: func(request: request) -> response } }
Rust code
wasmtime::component::bindgen!({ world: "http-interface", path: "http-interface.wit", async: true, });
Error:
this struct takes 0 lifetime arguments but 1 lifetime argument was supplied expected 0 lifetime arguments
Some expanded code maybe:
pub mod http_types { #[allow(unused_imports)] use wasmtime::component::__internal::anyhow; #[component(record)] pub struct Response {} #[component(record)] pub struct Request { #[component(name = "method")] pub method: String, } .... pub mod http_fetch { #[allow(unused_imports)] use wasmtime::component::__internal::anyhow; pub type Request = super::http_types::Request; pub type Response = super::http_types::Response; pub trait HttpFetch: Sized { #[must_use] #[allow(clippy::type_complexity, clippy::type_repetition_in_bounds)] fn fetch_request<'life0, 'async_trait>( &'life0 mut self, request: Request, ) -> ::core::pin::Pin< Box< dyn ::core::future::Future< Output = anyhow::Result<Response>, > + ::core::marker::Send + 'async_trait, >, > where 'life0: 'async_trait, Self: 'async_trait; } pub mod http_handler { #[allow(unused_imports)] use wasmtime::component::__internal::anyhow; pub type Request<'a> = super::http_types::Request<'a>; // <-- error message show on this line pub type Response = super::http_types::Response; pub struct HttpHandler { handle_request: wasmtime::component::Func, } impl HttpHandler { pub fn new( __exports: &mut wasmtime::component::ExportInstance<'_, '_>, ) -> anyhow::Result<HttpHandler> { let handle_request = *__exports .typed_func::<(Request<'_>,), (Response,)>("handle-request")? .func(); Ok(HttpHandler { handle_request }) } pub async fn handle_request<S: wasmtime::AsContextMut>( &self, mut store: S, arg0: Request<'_>, ) -> anyhow::Result<Response> where <S as wasmtime::AsContext>::Data: Send, { let callee = unsafe { wasmtime::component::TypedFunc::< (Request<'_>,), (Response,), >::new_unchecked(self.handle_request) }; let (ret0,) = callee.call_async(store.as_context_mut(), (arg0,)).await?; callee.post_return_async(store.as_context_mut()).await?; Ok(ret0) } } } }
It seems that
method:string
inrecord request
affects this case. ifrecord request{}
with no fields, it generatespub type Request = super::http_types::Request
without lifetime mark.
Last updated: Dec 23 2024 at 13:07 UTC