diff options
| author | 2025-02-12 01:51:20 +0100 | |
|---|---|---|
| committer | 2025-02-12 01:51:20 +0100 | |
| commit | 89a412695af321356a6f05f9111510d35a839983 (patch) | |
| tree | 12b342eb17688cbb07e6c9fd8748c42ef7591501 /examples/websocket/src/echo | |
| parent | bf205a88b66a6fa8ea6d9a259bfd0ed0b42a97b7 (diff) | |
| parent | e78c757cad5619c77a588054b42e9b87335d6e86 (diff) | |
| download | iced-89a412695af321356a6f05f9111510d35a839983.tar.gz iced-89a412695af321356a6f05f9111510d35a839983.tar.bz2 iced-89a412695af321356a6f05f9111510d35a839983.zip | |
Merge pull request #2805 from iced-rs/feature/sipper-support
`sipper` support and some QoL
Diffstat (limited to '')
| -rw-r--r-- | examples/websocket/src/echo.rs | 96 | 
1 files changed, 35 insertions, 61 deletions
| diff --git a/examples/websocket/src/echo.rs b/examples/websocket/src/echo.rs index 14652936..149a260c 100644 --- a/examples/websocket/src/echo.rs +++ b/examples/websocket/src/echo.rs @@ -1,73 +1,59 @@  pub mod server;  use iced::futures; -use iced::stream; +use iced::task::{sipper, Never, Sipper};  use iced::widget::text;  use futures::channel::mpsc;  use futures::sink::SinkExt; -use futures::stream::{Stream, StreamExt}; +use futures::stream::StreamExt;  use async_tungstenite::tungstenite;  use std::fmt; -pub fn connect() -> impl Stream<Item = Event> { -    stream::channel(100, |mut output| async move { -        let mut state = State::Disconnected; - +pub fn connect() -> impl Sipper<Never, Event> { +    sipper(|mut output| async move {          loop { -            match &mut state { -                State::Disconnected => { -                    const ECHO_SERVER: &str = "ws://127.0.0.1:3030"; +            const ECHO_SERVER: &str = "ws://127.0.0.1:3030"; -                    match async_tungstenite::tokio::connect_async(ECHO_SERVER) -                        .await -                    { -                        Ok((websocket, _)) => { -                            let (sender, receiver) = mpsc::channel(100); +            let (mut websocket, mut input) = +                match async_tungstenite::tokio::connect_async(ECHO_SERVER).await +                { +                    Ok((websocket, _)) => { +                        let (sender, receiver) = mpsc::channel(100); -                            let _ = output -                                .send(Event::Connected(Connection(sender))) -                                .await; +                        output.send(Event::Connected(Connection(sender))).await; -                            state = State::Connected(websocket, receiver); -                        } -                        Err(_) => { -                            tokio::time::sleep( -                                tokio::time::Duration::from_secs(1), -                            ) +                        (websocket.fuse(), receiver) +                    } +                    Err(_) => { +                        tokio::time::sleep(tokio::time::Duration::from_secs(1))                              .await; -                            let _ = output.send(Event::Disconnected).await; -                        } +                        output.send(Event::Disconnected).await; +                        continue;                      } -                } -                State::Connected(websocket, input) => { -                    let mut fused_websocket = websocket.by_ref().fuse(); - -                    futures::select! { -                        received = fused_websocket.select_next_some() => { -                            match received { -                                Ok(tungstenite::Message::Text(message)) => { -                                   let _ = output.send(Event::MessageReceived(Message::User(message))).await; -                                } -                                Err(_) => { -                                    let _ = output.send(Event::Disconnected).await; - -                                    state = State::Disconnected; -                                } -                                Ok(_) => continue, +                }; + +            loop { +                futures::select! { +                    received = websocket.select_next_some() => { +                        match received { +                            Ok(tungstenite::Message::Text(message)) => { +                                output.send(Event::MessageReceived(Message::User(message))).await; +                            } +                            Err(_) => { +                                output.send(Event::Disconnected).await; +                                break;                              } +                            Ok(_) => {},                          } +                    } +                    message = input.select_next_some() => { +                        let result = websocket.send(tungstenite::Message::Text(message.to_string())).await; -                        message = input.select_next_some() => { -                            let result = websocket.send(tungstenite::Message::Text(message.to_string())).await; - -                            if result.is_err() { -                                let _ = output.send(Event::Disconnected).await; - -                                state = State::Disconnected; -                            } +                        if result.is_err() { +                            output.send(Event::Disconnected).await;                          }                      }                  } @@ -76,18 +62,6 @@ pub fn connect() -> impl Stream<Item = Event> {      })  } -#[derive(Debug)] -#[allow(clippy::large_enum_variant)] -enum State { -    Disconnected, -    Connected( -        async_tungstenite::WebSocketStream< -            async_tungstenite::tokio::ConnectStream, -        >, -        mpsc::Receiver<Message>, -    ), -} -  #[derive(Debug, Clone)]  pub enum Event {      Connected(Connection), | 
