zulip-api 0.0.8

Client library for interacting with the Zulip API
Documentation
use serde::{Deserialize, Serialize};

use crate::filter::Narrow;
use crate::{field_access, impl_default, impl_display};

/// Represents the request for the `Matches Narrow` Zulip API endpoint.
///
/// See [check-messages-match-narrow](https://zulip.com/api/check-messages-match-narrow) for details.
#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
pub struct Request {
    msg_ids: Vec<u64>,
    narrow: Vec<Narrow>,
}

impl Request {
    /// Creates a new [Request].
    pub const fn new() -> Self {
        Self {
            msg_ids: Vec::new(),
            narrow: Vec::new(),
        }
    }
}

field_access! {
    Request {
        /// List of IDs for the messages to check.
        msg_ids: cow { [u64] },
        /// A structure defining the narrow to check against. See how to
        /// [construct a narrow](https://zulip.com/api/construct-narrow).
        ///
        /// **Changes**: See [changes section](https://zulip.com/api/construct-narrow#changes)
        /// of search/narrow filter documentation.
        narrow: cow { [Narrow] },
    }
}

impl_default!(Request);
impl_display!(Request);

#[cfg(test)]
mod tests {
    use super::*;
    use crate::filter::{Operand, Operator};

    #[test]
    fn test_request() {
        let msg_ids = [1u64];
        let narrow = [Narrow::new()
            .with_operator(Operator::Has)
            .with_operand(Operand::text("link"))];

        let request = Request::new()
            .with_msg_ids(msg_ids.as_ref())
            .with_narrow(narrow.as_ref());
        let request_json = request.to_string();

        assert_eq!(request.msg_ids(), msg_ids.as_ref());
        assert_eq!(request.narrow(), narrow.as_ref());

        assert_eq!(serde_json::to_string(&request).unwrap(), request_json);
        assert_eq!(
            serde_json::from_str::<Request>(&request_json).unwrap(),
            request
        );
    }
}