zulip-api 0.0.8

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

use crate::{field_access, impl_default, impl_display, Flag, Operation};

/// Represents the request for the `Update Message Flags` Zulip API endpoint.
///
/// See [update-message-flags](https://zulip.com/api/update-message-flags) for details.
#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
pub struct Request {
    messages: Vec<u64>,
    op: Operation,
    flag: Flag,
}

impl Request {
    /// Creates a new [Request].
    pub const fn new() -> Self {
        Self {
            messages: Vec::new(),
            op: Operation::new(),
            flag: Flag::new(),
        }
    }
}

field_access! {
    Request {
        /// An array containing the IDs of the target messages.
        messages: cow { [u64] },
    }
}

field_access! {
    Request {
        /// Whether to `add` the flag or `remove` it.
        op: Operation,
        /// The flag that should be added/removed.
        flag: Flag,
    }
}

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

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_request() {
        let messages = [1u64];
        let op = Operation::new();
        let flag = Flag::new();

        let request = Request::new()
            .with_messages(messages.as_ref())
            .with_op(op)
            .with_flag(flag);
        let request_json = request.to_string();

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

        assert_eq!(request.messages(), messages.as_ref());
        assert_eq!(request.op(), op);
        assert_eq!(request.flag(), flag);
    }
}