atagen

macltok

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