【Rust】WebSocketクライアント側のエラーハンドリング

websocketで通信して、connection errorや、通信内容の処理でのエラーハンドリング
以下のように書くと、接続先のURLにミスがあった場合もerrorを返してくれる。

#[tokio::main]
async fn main() {
    let url = format!("wss://echo.websocket.org/");
    // let url = format!("wss://echo.aaaaaaa.org/");
    let res = web_socket(url).await;
    match res {
        Ok(_) => {
            println!("wsに成功しました!");
        }
        Err(error) => {
            println!("wsに失敗");
            println!("{}", error);
        }
    }
}  

async fn web_socket(url: String) -> Result<(), Box<dyn std::error::Error>> {
    
    let mut ws = WebSocket::connect(&url).await?;
    ws.send_text("foo".to_string()).await?;
    ws.receive().await?;
    if let Frame::Text { payload: received_msg, .. } =  ws.receive().await? {
        println!("{}", received_msg);
        if received_msg != "hoge" {
            let error = "メッセージの照合に失敗しました。".to_string();
            return Err(error.into());
        }
    }
    ws.close(None).await?;
    Ok(())
}

– connectionエラー
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.17s
Running `target/debug/app`
wsに失敗
could not parse into SocketAddrs

– ソケット通信での内容でのエラーを明示的にエラーとして知らせる
Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.81s
Running `target/debug/app`
foo
wsに失敗
メッセージの照合に失敗しました。

– 成功時
Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.58s
Running `target/debug/app`
foo
wsに成功しました!

以下のような書き方はできない。

let mut ws = WebSocket::connect(&url).await?;
match ws {
    Ok(_) => {
        println!("wsに成功しました!");
    }
    Err(error) => {
        println!("wsに失敗");
        println!("{}", error);
    }
}

なるほど、これは面白い。