zulip_api/message/
propagate_mode.rs1use serde::{Deserialize, Serialize};
2
3use crate::{impl_default, impl_display, Error, Result};
4
5#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize)]
7#[serde(rename_all = "snake_case")]
8pub enum PropagateMode {
9 ChangeOne,
11 ChangeLater,
13 ChangeAll,
15}
16
17impl PropagateMode {
18 pub const CHANGE_ONE: &str = "change_one";
20 pub const CHANGE_LATER: &str = "change_later";
22 pub const CHANGE_ALL: &str = "change_all";
24
25 pub const fn new() -> Self {
27 Self::ChangeOne
28 }
29
30 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}