use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct Message {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notification: Option<Notification>,
#[serde(skip_serializing_if = "Option::is_none")]
pub android: Option<AndroidConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub webpush: Option<WebpushConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub apns: Option<ApnsConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fcm_options: Option<FcmOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub topic: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub condition: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct MulticastMessage {
pub tokens: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notification: Option<Notification>,
#[serde(skip_serializing_if = "Option::is_none")]
pub android: Option<AndroidConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub webpush: Option<WebpushConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub apns: Option<ApnsConfig>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fcm_options: Option<FcmOptions>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct Notification {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub body: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct AndroidConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub collapse_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<AndroidMessagePriority>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ttl: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub restricted_package_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notification: Option<AndroidNotification>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fcm_options: Option<AndroidFcmOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub direct_boot_ok: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum AndroidMessagePriority {
Normal,
High,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct AndroidNotification {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub body: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub icon: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sound: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub click_action: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub body_loc_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub body_loc_args: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title_loc_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title_loc_args: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channel_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ticker: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sticky: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub event_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub local_only: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notification_priority: Option<NotificationPriority>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_sound: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_vibrate_timings: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_light_settings: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vibrate_timings: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub visibility: Option<Visibility>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notification_count: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub light_settings: Option<LightSettings>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum NotificationPriority {
PriorityUnspecified,
PriorityMin,
PriorityLow,
PriorityDefault,
PriorityHigh,
PriorityMax,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum Visibility {
VisibilityUnspecified,
Private,
Public,
Secret,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct LightSettings {
pub color: Option<Color>,
pub light_on_duration: Option<String>,
pub light_off_duration: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct Color {
pub red: Option<f32>,
pub green: Option<f32>,
pub blue: Option<f32>,
pub alpha: Option<f32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct AndroidFcmOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub analytics_label: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct WebpushConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notification: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fcm_options: Option<WebpushFcmOptions>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct WebpushFcmOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub link: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub analytics_label: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct ApnsConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payload: Option<ApnsPayload>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fcm_options: Option<ApnsFcmOptions>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct ApnsPayload {
#[serde(skip_serializing_if = "Option::is_none")]
pub aps: Option<Aps>,
#[serde(flatten)]
pub custom_data: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "kebab-case")]
pub struct Aps {
#[serde(skip_serializing_if = "Option::is_none")]
pub alert: Option<ApsAlert>,
#[serde(skip_serializing_if = "Option::is_none")]
pub badge: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sound: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content_available: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mutable_content: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub category: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thread_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ApsAlert {
String(String),
Dictionary(ApsAlertDictionary),
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "kebab-case")]
pub struct ApsAlertDictionary {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subtitle: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub body: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub loc_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub loc_args: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title_loc_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title_loc_args: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subtitle_loc_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subtitle_loc_args: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub action_loc_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub launch_image: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct ApnsFcmOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub analytics_label: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct FcmOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub analytics_label: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct TopicManagementResponse {
pub success_count: usize,
pub failure_count: usize,
pub errors: Vec<TopicManagementError>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TopicManagementError {
pub index: usize,
pub reason: String,
}
#[derive(Debug, Clone, Default)]
pub struct BatchResponse {
pub success_count: usize,
pub failure_count: usize,
pub responses: Vec<SendResponse>,
}
#[derive(Debug, Clone)]
pub struct SendResponse {
pub success: bool,
pub message_id: Option<String>,
pub error: Option<String>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct SendResponseInternal {
pub name: String,
}