| 1 | #![allow(dead_code)] |
| 2 | |
| 3 | use std::time::Duration; |
| 4 | |
| 5 | use macltok::{ClientHandle, Event, EventStream, TimelineDiff, TimelineItem, TimelineMessage}; |
| 6 | |
| 7 | pub async fn receive_until(events: &mut EventStream, predicate: impl Fn(&Event) -> bool) -> Event { |
| 8 | tokio::time::timeout(Duration::from_secs(5), async { |
| 9 | while let Some(event) = events.recv().await { |
| 10 | if predicate(&event) { |
| 11 | return event; |
| 12 | } |
| 13 | } |
| 14 | panic!("event stream closed before the expected event"); |
| 15 | }) |
| 16 | .await |
| 17 | .expect("expected event did not arrive") |
| 18 | } |
| 19 | |
| 20 | /// asks for a shutdown while still draining, since the engine won't answer until its events are out |
| 21 | pub async fn shut_down( |
| 22 | handle: &ClientHandle, |
| 23 | events: &mut EventStream, |
| 24 | running: tokio::task::JoinHandle<Result<(), macltok::EngineError>>, |
| 25 | ) { |
| 26 | let (answer, _) = tokio::join!(handle.shutdown(), async { |
| 27 | receive_until(events, |event| matches!(event, Event::Stopped)).await |
| 28 | }); |
| 29 | answer.unwrap(); |
| 30 | running.await.unwrap().unwrap(); |
| 31 | } |
| 32 | |
| 33 | pub fn event_messages(event: &Event) -> Vec<&TimelineMessage> { |
| 34 | let items = match event { |
| 35 | Event::TimelineReset { items, .. } => items.iter().collect::<Vec<_>>(), |
| 36 | Event::TimelineChanged { diffs, .. } => diffs.iter().flat_map(diff_items).collect(), |
| 37 | _ => Vec::new(), |
| 38 | }; |
| 39 | items |
| 40 | .into_iter() |
| 41 | .filter_map(|item| match item { |
| 42 | TimelineItem::Message(message) => Some(message.as_ref()), |
| 43 | _ => None, |
| 44 | }) |
| 45 | .collect() |
| 46 | } |
| 47 | |
| 48 | pub fn diff_items(diff: &TimelineDiff) -> Vec<&TimelineItem> { |
| 49 | match diff { |
| 50 | TimelineDiff::Append { values } | TimelineDiff::Reset { values } => values.iter().collect(), |
| 51 | TimelineDiff::PushFront { value } |
| 52 | | TimelineDiff::PushBack { value } |
| 53 | | TimelineDiff::Insert { value, .. } |
| 54 | | TimelineDiff::Set { value, .. } => vec![value], |
| 55 | _ => Vec::new(), |
| 56 | } |
| 57 | } |