Skip to main content

synd_client/payload/
event.rs

1use serde::Deserialize;
2use synd_feed::types::{FeedUrl, Time};
3
4#[derive(Debug, Clone, Deserialize)]
5#[serde(tag = "__typename")]
6pub enum FeedEvent {
7    TimelineChanged(TimelineChangeEvent),
8}
9
10#[derive(Debug, Clone, Deserialize)]
11#[serde(rename_all = "camelCase")]
12pub struct TimelineChangeEvent {
13    pub changed_at: Time,
14    pub affected_feeds: Option<Vec<FeedUrl>>,
15}
16
17#[cfg(test)]
18mod tests {
19    use core::assert_matches;
20
21    use super::FeedEvent;
22
23    #[test]
24    fn decodes_timeline_changed_feed_event() {
25        let event: FeedEvent = serde_json::from_value(serde_json::json!({
26            "__typename": "TimelineChanged",
27            "changedAt": "2026-06-13T00:00:00Z",
28            "affectedFeeds": ["https://example.com/feed.xml"]
29        }))
30        .unwrap();
31
32        let FeedEvent::TimelineChanged(event) = event;
33        assert_eq!(event.changed_at.to_rfc3339(), "2026-06-13T00:00:00+00:00");
34        assert_matches!(event.affected_feeds, Some(feeds) if feeds.len() == 1);
35    }
36}