Skip to main content

zulip_api/message/
propagate_mode.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{impl_default, impl_display, Error, Result};
4
5/// Represents the propagation mode on a Zulip server.
6#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize)]
7#[serde(rename_all = "snake_case")]
8pub enum PropagateMode {
9    /// Indicates changing one message.
10    ChangeOne,
11    /// Indicates changing the target message, and all following messages in a topic.
12    ChangeLater,
13    /// Indicates changing all messages in a topic.
14    ChangeAll,
15}
16
17impl PropagateMode {
18    /// Represents the [PropagateMode] change one string value.
19    pub const CHANGE_ONE: &str = "change_one";
20    /// Represents the [PropagateMode] change later string value.
21    pub const CHANGE_LATER: &str = "change_later";
22    /// Represents the [PropagateMode] change all string value.
23    pub const CHANGE_ALL: &str = "change_all";
24
25    /// Creates a new [PropagateMode].
26    pub const fn new() -> Self {
27        Self::ChangeOne
28    }
29
30    /// Gets the [PropagateMode] string representation.
31    pub const fn as_str(&self) -> &'static str {
32        match self {
33            Self::ChangeOne => Self::CHANGE_ONE,
34            Self::ChangeLater => Self::CHANGE_LATER,
35            Self::ChangeAll => Self::CHANGE_ALL,
36        }
37    }
38}
39
40impl_default!(PropagateMode);
41impl_display!(PropagateMode);
42
43impl From<PropagateMode> for &'static str {
44    fn from(val: PropagateMode) -> Self {
45        val.as_str()
46    }
47}
48
49impl TryFrom<&str> for PropagateMode {
50    type Error = Error;
51
52    fn try_from(val: &str) -> Result<Self> {
53        match val.to_lowercase().as_str() {
54            Self::CHANGE_ONE => Ok(Self::ChangeOne),
55            Self::CHANGE_LATER => Ok(Self::ChangeLater),
56            Self::CHANGE_ALL => Ok(Self::ChangeAll),
57            _ => Err(Error::invalid_field(
58                "propagate_mode",
59                val,
60                "change_one | change_later | change_all",
61            )),
62        }
63    }
64}
65
66impl TryFrom<String> for PropagateMode {
67    type Error = Error;
68
69    fn try_from(val: String) -> Result<Self> {
70        Self::try_from(val.as_str())
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77
78    #[test]
79    fn test_propagate_mode() {
80        [
81            (PropagateMode::ChangeOne, PropagateMode::CHANGE_ONE),
82            (PropagateMode::ChangeLater, PropagateMode::CHANGE_LATER),
83            (PropagateMode::ChangeAll, PropagateMode::CHANGE_ALL),
84        ]
85        .into_iter()
86        .for_each(|(mode, mode_str)| {
87            assert_eq!(mode.as_str(), mode_str);
88            let mode_json = format!(r#""{mode_str}""#);
89
90            assert_eq!(<&str>::from(mode), mode_str);
91            assert_eq!(PropagateMode::try_from(mode_str).unwrap(), mode);
92
93            assert_eq!(serde_json::to_string(&mode).unwrap(), mode_json);
94            assert_eq!(
95                serde_json::from_str::<PropagateMode>(&mode_json).unwrap(),
96                mode
97            );
98        });
99    }
100}