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