DelSkayn / rquickjs

High level bindings to the quickjs javascript engine
MIT License
435 stars 59 forks source link

Tuple return type not implemented #212

Closed stevefan1999-personal closed 9 months ago

stevefan1999-personal commented 9 months ago

Given both TcpStreamWrapper, SocketAddrWrapper implemented JS value convertion:

#[rquickjs::methods]
impl TcpListenerWrapper {
    // instance property getter
    #[qjs(get, enumerable)]
    pub fn local_addr(&self) -> rquickjs::Result<SocketAddrWrapper> {
        let addr = self.deref().local_addr()?;
        Ok(Cell::new(addr).into())
    }

    pub async fn accept(self) -> rquickjs::Result<(TcpStreamWrapper, SocketAddrWrapper)> {
        let (stream, addr) = self
            .deref()
            .accept()
            .with_cancellation(&WORLD_END.child_token())
            .await??;
        let stream = Arc::new(RwLock::new(stream));
        let addr = Cell::new(addr);
        Ok((stream.into(), addr.into()))
    }
}

Emits error:

error[E0277]: the trait bound `(socket::TcpStreamWrapper, socket_addr::SocketAddrWrapper): rquickjs::IntoJs<'_>` is not satisfied
  --> den-stdlib-socket\src\socket.rs:58:1
   |
58 | #[rquickjs::methods]
   | ^^^^^^^^^^^^^^^^^^^^ the trait `rquickjs::IntoJs<'_>` is not implemented for `(socket::TcpStreamWrapper, socket_addr::SocketAddrWrapper)`
   |
   = help: the following other types implement trait `rquickjs::IntoJs<'js>`:
             &()
             ()
   = note: required for `Result<(socket::TcpStreamWrapper, socket_addr::SocketAddrWrapper), rquickjs::Error>` to implement `rquickjs::IntoJs<'_>`
   = note: 1 redundant requirement hidden
   = note: required for `Promised<[async block@den-stdlib-socket\src\socket.rs:58:1: 58:21]>` to implement `rquickjs::IntoJs<'_>`
   = note: this error originates in the attribute macro `rquickjs::methods` (in Nightly builds, run with -Z macro-backtrace for more info)

For more information about this error, try `rustc --explain E0277`.
error: could not compile `den-stdlib-socket` (lib) due to previous error
stevefan1999-personal commented 9 months ago

Hmm seems like List is for that?

stevefan1999-personal commented 9 months ago

Yeah I think so...:

#[rquickjs::methods]
impl TcpListenerWrapper {
    #[qjs(get, enumerable)]
    pub fn local_addr(&self) -> rquickjs::Result<SocketAddrWrapper> {
        Ok(self.deref().local_addr()?.into())
    }

    pub async fn accept(self) -> rquickjs::Result<List<(TcpStreamWrapper, SocketAddrWrapper)>> {
        let (stream, addr) = self
            .deref()
            .accept()
            .with_cancellation(&WORLD_END.child_token())
            .await??;
        let stream = Arc::new(RwLock::new(stream));
        Ok(List((stream.into(), addr.into())))
    }
}

Didn't realize it sorry