2017-05-15 8 views
0

エラーチェーンをwebsocketクレートとともに使用しようとしていますが、解決方法がわからないという問題が発生しています。 Err変異体がタプルであることエラーチェーンとwebsocketクレートとの錆の衝突

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

注:WsUpgrade::acceptは、次のシグネチャを有しています。私は、このメソッドの呼び出しを処理するために、エラー・チェーンを構成するので、関連する消費モジュールに次のように私はそうしてみました:

これは、次のエラーが発生し
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)); 
    |     ^

どうすれば解決できますか?うまくいけば私は単純なものを見逃してしまったのです。

答えて

1

簡単な解決策は、型エイリアスを導入することであろう。

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)