use salvo::prelude::*;
use serde::{Deserialize, Serialize};
use crate::push::Action;
use crate::push::NewConditionalPushRule;
use crate::push::NewPatternedPushRule;
use crate::push::NewSimplePushRule;
use crate::push::PushCondition;
use crate::{OwnedRoomId, OwnedUserId, PrivOwnedStr, serde::StringEnum};
#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))]
#[derive(ToSchema, Clone, PartialEq, Eq, PartialOrd, Ord, StringEnum)]
#[palpo_enum(rename_all = "snake_case")]
#[non_exhaustive]
pub enum RuleKind {
Override,
Underride,
Sender,
Room,
Content,
#[doc(hidden)]
#[salvo(schema(value_type = String))]
_Custom(PrivOwnedStr),
}
#[derive(ToSchema, Deserialize, Clone, Debug)]
pub enum NewPushRule {
Override(NewConditionalPushRule),
Content(NewPatternedPushRule),
Room(NewSimplePushRule<OwnedRoomId>),
Sender(NewSimplePushRule<OwnedUserId>),
Underride(NewConditionalPushRule),
}
impl NewPushRule {
pub fn kind(&self) -> RuleKind {
match self {
NewPushRule::Override(_) => RuleKind::Override,
NewPushRule::Content(_) => RuleKind::Content,
NewPushRule::Room(_) => RuleKind::Room,
NewPushRule::Sender(_) => RuleKind::Sender,
NewPushRule::Underride(_) => RuleKind::Underride,
}
}
pub fn rule_id(&self) -> &str {
match self {
NewPushRule::Override(r) => &r.rule_id,
NewPushRule::Content(r) => &r.rule_id,
NewPushRule::Room(r) => r.rule_id.as_ref(),
NewPushRule::Sender(r) => r.rule_id.as_ref(),
NewPushRule::Underride(r) => &r.rule_id,
}
}
}
#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))]
#[derive(ToSchema, Clone, PartialEq, Eq, StringEnum)]
#[palpo_enum(rename_all = "lowercase")]
#[non_exhaustive]
pub enum RuleScope {
Global,
#[doc(hidden)]
#[salvo(schema(skip))]
_Custom(PrivOwnedStr),
}
#[derive(ToSchema, Clone, Debug, Serialize, Deserialize)]
pub struct PushRule {
pub actions: Vec<Action>,
pub default: bool,
pub enabled: bool,
pub rule_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub conditions: Option<Vec<PushCondition>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pattern: Option<String>,
}
#[derive(ToParameters, Deserialize, Debug)]
pub struct ScopeKindRuleReqArgs {
#[salvo(parameter(parameter_in = Path))]
pub scope: RuleScope,
#[salvo(parameter(parameter_in = Path))]
pub kind: RuleKind,
#[salvo(parameter(parameter_in = Path))]
pub rule_id: String,
}