diff --git a/crates/lb/src/net.rs b/crates/lb/src/net.rs index 6700a48..0dc07a2 100644 --- a/crates/lb/src/net.rs +++ b/crates/lb/src/net.rs @@ -27,7 +27,7 @@ pub enum Error { /// IP or socket address syntax error. #[error("{0}")] InvalidAddr(#[from] AddrParseError), - /// Socket was already converted and cannot be used. + /// Socket was already converted and cannot be used anymore. #[error("socket was already converted")] SocketConsumed, } @@ -141,7 +141,7 @@ impl lb_netlib { Ok(Some(TcpSocket::new_v6()?).into()) } - pub extern "Lua" fn bind_tcp(&self, addr: any, port: any) -> Result { + pub async extern "Lua" fn bind_tcp(&self, addr: any, port: any) -> Result { let addr = self.socketaddr(addr, port); let socket; if addr.ip().is_v6() { @@ -153,7 +153,7 @@ impl lb_netlib { socket } - pub extern "Lua" fn connect_tcp(&self, addr: any, port: any) -> Result { + pub async extern "Lua" fn connect_tcp(&self, addr: any, port: any) -> Result { let addr = self.socketaddr(addr, port); let socket; if addr.ip().is_v6() { @@ -164,7 +164,7 @@ impl lb_netlib { socket.connect(addr) } - pub extern "Lua" fn listen_tcp(&self, addr: any, port: any) -> Result { + pub async extern "Lua" fn listen_tcp(&self, addr: any, port: any) -> Result { self.bind_tcp(addr, port).listen(1024) } } diff --git a/crates/lb/src/task.rs b/crates/lb/src/task.rs index 518d84b..6f540ae 100644 --- a/crates/lb/src/task.rs +++ b/crates/lb/src/task.rs @@ -35,7 +35,7 @@ impl lb_tasklib { sleep(Duration::from_secs_f64(ms / 1000.)).await; } - pub extern "Lua" fn spawn(&self, f: function, ...) { + pub extern "Lua" fn spawn(&self, f: function, ...) -> lb_task { // pack the function and its arguments into a table and pass its ref to rust. // // this table is used from rust-side to call the function with its args, and it's also @@ -82,7 +82,7 @@ pub struct lb_task { #[metatype] impl lb_task { - pub extern "Lua" fn r#await(&self) -> many { + pub async extern "Lua" fn r#await(&self) -> many { self.__await(); let ret = __registry[self.__ref]; __tunpack(ret, 1, ret.n) diff --git a/crates/luaffi_impl/src/metatype.rs b/crates/luaffi_impl/src/metatype.rs index d670ea9..125e87c 100644 --- a/crates/luaffi_impl/src/metatype.rs +++ b/crates/luaffi_impl/src/metatype.rs @@ -285,7 +285,7 @@ fn get_ffi_functions(imp: &mut ItemImpl) -> Result> { let attrs = parse_ffi_function_attrs(&mut func.attrs)?; attrs.metamethod.map(|mm| document_metamethod(func, mm)); - + func.sig.asyncness.is_some().then(|| document_async(func)); document_ffi_function(func); funcs.push(FfiFunction { @@ -573,6 +573,12 @@ fn get_lua_functions(imp: &mut ItemImpl) -> Result> { "cannot be generic" ); + syn_assert!( + func.sig.constness.is_none(), + func.sig.constness, + "cannot be const" + ); + let mut params: Vec<_> = func .sig .inputs @@ -593,7 +599,7 @@ fn get_lua_functions(imp: &mut ItemImpl) -> Result> { let attrs = parse_lua_function_attrs(&mut func.attrs)?; attrs.metamethod.map(|mm| document_metamethod(func, mm)); - + func.sig.asyncness.is_some().then(|| document_async(func)); document_lua_function(func); funcs.push(LuaFunction { @@ -807,6 +813,12 @@ fn document_lua_function(func: &mut ImplItemFn) { ])); } +fn document_async(func: &mut ImplItemFn) { + func.attrs.insert(0, parse_quote!(#[doc = + r#"Async"# + ])); +} + fn document_metamethod(func: &mut ImplItemFn, method: Metamethod) { let s = match method { Metamethod::Eq => "This is a metamethod which is called by the `==` operator.".into(),