concord 2.4.3

A terminal user interface client for Discord
Documentation
use serde_json::Value;

use crate::discord::{events::AppEvent, ids::Id};

pub(super) fn parse_recent_mention_delete(data: &Value) -> Option<AppEvent> {
    Some(AppEvent::InboxRecentMentionDeleted {
        message_id: parse_id(data.get("message_id")?)?,
    })
}

fn parse_id<T>(value: &Value) -> Option<Id<T>> {
    value
        .as_str()
        .and_then(|raw| raw.parse().ok())
        .or_else(|| value.as_u64())
        .and_then(Id::new_checked)
}

#[cfg(test)]
mod tests {
    use serde_json::json;

    use super::*;
    use crate::discord::ids::marker::MessageMarker;

    #[test]
    fn recent_mention_delete_keeps_the_message_id() {
        assert!(matches!(
            parse_recent_mention_delete(&json!({ "message_id": "200" })),
            Some(AppEvent::InboxRecentMentionDeleted { message_id })
                if message_id == Id::<MessageMarker>::new(200)
        ));
    }
}