palpo_core/push/
push_rule.rs1use salvo::prelude::*;
18use serde::{Deserialize, Serialize};
19
20use crate::push::Action;
21use crate::push::NewConditionalPushRule;
22use crate::push::NewPatternedPushRule;
23use crate::push::NewSimplePushRule;
24use crate::push::PushCondition;
25use crate::{OwnedRoomId, OwnedUserId, PrivOwnedStr, serde::StringEnum};
26
27#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))]
29#[derive(ToSchema, Clone, PartialEq, Eq, PartialOrd, Ord, StringEnum)]
30#[palpo_enum(rename_all = "snake_case")]
31#[non_exhaustive]
32pub enum RuleKind {
33 Override,
35
36 Underride,
38
39 Sender,
41
42 Room,
44
45 Content,
47
48 #[doc(hidden)]
49 #[salvo(schema(value_type = String))]
50 _Custom(PrivOwnedStr),
51}
52
53#[derive(ToSchema, Deserialize, Clone, Debug)]
55pub enum NewPushRule {
56 Override(NewConditionalPushRule),
58
59 Content(NewPatternedPushRule),
61
62 Room(NewSimplePushRule<OwnedRoomId>),
64
65 Sender(NewSimplePushRule<OwnedUserId>),
67
68 Underride(NewConditionalPushRule),
70}
71
72impl NewPushRule {
73 pub fn kind(&self) -> RuleKind {
75 match self {
76 NewPushRule::Override(_) => RuleKind::Override,
77 NewPushRule::Content(_) => RuleKind::Content,
78 NewPushRule::Room(_) => RuleKind::Room,
79 NewPushRule::Sender(_) => RuleKind::Sender,
80 NewPushRule::Underride(_) => RuleKind::Underride,
81 }
82 }
83
84 pub fn rule_id(&self) -> &str {
86 match self {
87 NewPushRule::Override(r) => &r.rule_id,
88 NewPushRule::Content(r) => &r.rule_id,
89 NewPushRule::Room(r) => r.rule_id.as_ref(),
90 NewPushRule::Sender(r) => r.rule_id.as_ref(),
91 NewPushRule::Underride(r) => &r.rule_id,
92 }
93 }
94}
95
96#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))]
98#[derive(ToSchema, Clone, PartialEq, Eq, StringEnum)]
99#[palpo_enum(rename_all = "lowercase")]
100#[non_exhaustive]
101pub enum RuleScope {
102 Global,
104
105 #[doc(hidden)]
106 #[salvo(schema(skip))]
107 _Custom(PrivOwnedStr),
108}
109
110#[derive(ToSchema, Clone, Debug, Serialize, Deserialize)]
115pub struct PushRule {
116 pub actions: Vec<Action>,
118
119 pub default: bool,
121
122 pub enabled: bool,
124
125 pub rule_id: String,
127
128 #[serde(skip_serializing_if = "Option::is_none")]
133 pub conditions: Option<Vec<PushCondition>>,
134
135 #[serde(skip_serializing_if = "Option::is_none")]
139 pub pattern: Option<String>,
140}
141
142#[derive(ToParameters, Deserialize, Debug)]
143pub struct ScopeKindRuleReqArgs {
144 #[salvo(parameter(parameter_in = Path))]
146 pub scope: RuleScope,
147
148 #[salvo(parameter(parameter_in = Path))]
150 pub kind: RuleKind,
151
152 #[salvo(parameter(parameter_in = Path))]
154 pub rule_id: String,
155}