use js_option::JsOption;
use salvo::prelude::*;
use serde::{Deserialize, Serialize, de, ser::SerializeStruct};
use crate::RawJsonValue;
use crate::push::{Pusher, PusherIds};
use crate::serde::from_raw_json_value;
#[derive(ToSchema, Serialize, Debug)]
pub struct PushersResBody {
pub pushers: Vec<Pusher>,
}
impl PushersResBody {
pub fn new(pushers: Vec<Pusher>) -> Self {
Self { pushers }
}
}
#[derive(ToSchema, Deserialize, Debug)]
pub struct SetPusherReqBody(pub PusherAction);
#[derive(ToSchema, Clone, Debug)]
pub enum PusherAction {
Post(PusherPostData),
Delete(PusherIds),
}
impl Serialize for PusherAction {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match self {
PusherAction::Post(pusher) => pusher.serialize(serializer),
PusherAction::Delete(ids) => {
let mut st = serializer.serialize_struct("PusherAction", 3)?;
st.serialize_field("pushkey", &ids.pushkey)?;
st.serialize_field("app_id", &ids.app_id)?;
st.serialize_field("kind", &None::<&str>)?;
st.end()
}
}
}
}
#[derive(Debug, Deserialize)]
struct PusherActionDeHelper {
kind: JsOption<String>,
}
impl<'de> Deserialize<'de> for PusherAction {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: de::Deserializer<'de>,
{
let json = Box::<RawJsonValue>::deserialize(deserializer)?;
let PusherActionDeHelper { kind } = from_raw_json_value(&json)?;
match kind {
JsOption::Some(_) => Ok(Self::Post(from_raw_json_value(&json)?)),
JsOption::Null => Ok(Self::Delete(from_raw_json_value(&json)?)),
JsOption::Undefined => Err(de::Error::missing_field("kind")),
}
}
}
#[derive(ToSchema, Serialize, Clone, Debug)]
pub struct PusherPostData {
#[serde(flatten)]
pub pusher: Pusher,
#[serde(skip_serializing_if = "crate::serde::is_default", default = "default_false")]
pub append: bool,
}
#[derive(Debug, Deserialize)]
struct PusherPostDataDeHelper {
#[serde(default)]
append: bool,
}
impl<'de> Deserialize<'de> for PusherPostData {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: de::Deserializer<'de>,
{
let json = Box::<RawJsonValue>::deserialize(deserializer)?;
let PusherPostDataDeHelper { append } = from_raw_json_value(&json)?;
let pusher = from_raw_json_value(&json)?;
Ok(Self { pusher, append })
}
}