Rust 与错误链和 websocket crate 冲突

标签 rust

我正在尝试将错误链与 websocket crate 一起使用,但遇到了一个我不确定如何解决的问题。 WsUpgrade::accept具有以下签名:

fn accept(self) -> Result<Client<S>, (S, IoError)>

请注意,Err 变体是一个元组。我想配置错误链来处理对此方法的调用,所以我尝试在相关的消费模块中按如下方式进行:

mod errors {
    error_chain! {
        foreign_links {
            WebSock((::std::net::TcpStream, ::std::io::Error));
        }
    }
}

这会导致以下错误,似乎与元组的存在有关。

error: expected identifier, found `(`
  --> src/lib/websock.rs:23:21
   |
23 |             WebSock((::std::net::TcpStream, ::std::io::Error));
   |                     ^

我该如何解决这个问题?希望我错过了一些简单的事情。

最佳答案

一个简单的解决方案是引入类型别名:

mod errors {
    type WebSocketError = (::std::net::TcpStream, ::std::io::Error);
    error_chain! {
        foreign_links {
            WebSock(WebSocketError);
        }
    }
}

但是,此类型未实现错误链所需的特征(例如 ErrorDisplay ),因此不能在那里使用。

我认为最简单的解决方案是使用 Result::map_err 手动转换错误在将值传递给错误链之前。例如,以下构造将产生 Result<Client<S>, IoError> :

x.accept().map_err(|e| e.1)

关于Rust 与错误链和 websocket crate 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43970529/

相关文章:

rust - "try!"宏在 Rust 升级后停止工作

rust - 将在 FnMut 上实现的特征传递给辅助函数而不移动

rust - 为什么我应该散列近协议(protocol) Unordered_Map 中的键?

rust - Rust 中状态和回调的唯一指针

rust - 将泛型转换为元组以进行调试

rust - Rust 的 C++ Friend-like 构造

rust - 如何用未装箱的闭包替换 proc?

recursion - Rust 中任意递归期间变异状态的惯用所有权管理

generics - 限制可包装使用的模板

rust - 从拥有的资源中归还借用