Пересылка данных в канал Tokio mpsc из потока

Я пытаюсь создать асинхронный клиент Rust, который подключается к серверу WebSocket на одном конце и ключу Bluetooth на другом конце. Между ними будет некоторая логика для фильтрации сообщений.

Я использую асинхронный модуль rust-websocket для стороны WebSocket.

Я хотел бы выделить три компонента (отправка / получение через веб-сокет, отправка / получение через Bluetooth, обработка сообщений). Для этого я хочу использовать futures::sync::mpsc канал как Sink для передачи сообщений от приемника WebSocket в часть цикла обработки сообщений. Ниже приведена упрощенная часть моего кода:

const CONNECTION: &'static str = "ws://127.0.0.1:4000/socket/websocket";

fn main() {
    let mut core = Core::new().unwrap();

    let (ws_send, ws_recv) = mpsc::channel(100);
    let (ws_to_main, main_from_ws) = mpsc::channel(100);

    let ws_future = ClientBuilder::new(CONNECTION)
        .unwrap()
        .add_protocol("rust-websocket")
        .async_connect_insecure(&core.handle())
        .and_then(|(duplex, _)| {
            let (mut sink, stream) = duplex.split();

            stream
                .filter_map(|message| {
                    println!("Received Message: {:?}", message);
                    match message {
                        OwnedMessage::Close(e) => Some(OwnedMessage::Close(e)),
                        OwnedMessage::Ping(d) => Some(OwnedMessage::Pong(d)),
                        OwnedMessage::Text(msg) => Some(OwnedMessage::Text(msg)),
                        _ => None,
                    }
                })
                .forward(ws_to_main)
        });
    let result = core.run(ws_future).unwrap();
}

Однако когда я запускаю этот код, я получаю несколько сообщений об ошибках, которые выглядят так:

error[E0277]: the trait bound `websocket::WebSocketError: std::convert::From<futures::sync::mpsc::SendError<websocket::OwnedMessage>>` is not satisfied
   --> src/main.rs:103:22
    |
103 |                     .forward(ws_to_main)
    |                      ^^^^^^^ the trait `std::convert::From<futures::sync::mpsc::SendError<websocket::OwnedMessage>>` is not implemented for `websocket::WebSocketError`
    |
    = help: the following implementations were found:
              <websocket::WebSocketError as std::convert::From<std::io::Error>>
              <websocket::WebSocketError as std::convert::From<hyper::error::Error>>
              <websocket::WebSocketError as std::convert::From<websocket::client::ParseError>>
              <websocket::WebSocketError as std::convert::From<native_tls::Error>>
            and 5 others

Я попытался взломать это немного с .map_err который превращает ошибки в SendError, но SendError структура является частной.

0 ответов

Быстрое решение заключается в преобразовании типа ошибки пара и приемника в один:

stream
  .map_err(|err| eprintln!("stream error: {}", err))
  .forward(sink.sink_map_err(|err| eprintln!("sink error: {}", err)))
Другие вопросы по тегам