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};

/// Represents a request to the `Get File Temporary URL` Zulip API endpoint.
///
/// See [get-file-temporary-url](https://zulip.com/api/get-file-temporary-url) for details.
#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
pub struct Request {
    realm_id: u64,
    filename: String,
}

impl Request {
    /// Creates a new [Request].
    pub const fn new() -> Self {
        Self {
            realm_id: 0,
            filename: String::new(),
        }
    }
}

field_access! {
    Request {
        /// The ID of the Zulip organization.
        realm_id: u64,
    }
}

field_access! {
    Request {
        /// Path to the [uploaded file](https://zulip.com/api/upload-file).
        ///
        /// Example: `4e/m2A3MSqFnWRLUf9SaPzQ0Up_/zulip.txt`.
        filename: cow { str },
    }
}

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

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

    #[test]
    fn test_request() {
        let realm_id = 1;
        let filename = "4e/m2A3MSqFnWRLUf9SaPzQ0Up_/zulip.txt";

        let request = Request::new()
            .with_realm_id(realm_id)
            .with_filename(filename);
        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.realm_id(), realm_id);
        assert_eq!(request.filename(), filename);
    }
}