firebase_rs_sdk/messaging/
error.rs

1use std::fmt::{Display, Formatter};
2
3#[derive(Clone, Debug, PartialEq, Eq)]
4pub enum MessagingErrorCode {
5    TokenDeletionFailed,
6    InvalidArgument,
7    Internal,
8    PermissionBlocked,
9    AvailableInWindow,
10    AvailableInServiceWorker,
11    UnsupportedBrowser,
12    FailedDefaultRegistration,
13    InvalidServiceWorkerRegistration,
14    TokenSubscribeFailed,
15    TokenUnsubscribeFailed,
16    TokenSubscribeNoToken,
17    TokenUpdateFailed,
18    TokenUpdateNoToken,
19}
20
21impl MessagingErrorCode {
22    pub fn as_str(&self) -> &'static str {
23        match self {
24            MessagingErrorCode::TokenDeletionFailed => "messaging/token-deletion-failed",
25            MessagingErrorCode::InvalidArgument => "messaging/invalid-argument",
26            MessagingErrorCode::Internal => "messaging/internal",
27            MessagingErrorCode::PermissionBlocked => "messaging/permission-blocked",
28            MessagingErrorCode::AvailableInWindow => "messaging/available-in-window",
29            MessagingErrorCode::AvailableInServiceWorker => "messaging/available-in-sw",
30            MessagingErrorCode::UnsupportedBrowser => "messaging/unsupported-browser",
31            MessagingErrorCode::FailedDefaultRegistration => {
32                "messaging/failed-service-worker-registration"
33            }
34            MessagingErrorCode::InvalidServiceWorkerRegistration => {
35                "messaging/invalid-sw-registration"
36            }
37            MessagingErrorCode::TokenSubscribeFailed => "messaging/token-subscribe-failed",
38            MessagingErrorCode::TokenUnsubscribeFailed => "messaging/token-unsubscribe-failed",
39            MessagingErrorCode::TokenSubscribeNoToken => "messaging/token-subscribe-no-token",
40            MessagingErrorCode::TokenUpdateFailed => "messaging/token-update-failed",
41            MessagingErrorCode::TokenUpdateNoToken => "messaging/token-update-no-token",
42        }
43    }
44}
45
46#[derive(Clone, Debug)]
47pub struct MessagingError {
48    pub code: MessagingErrorCode,
49    message: String,
50}
51
52impl MessagingError {
53    pub fn new(code: MessagingErrorCode, message: impl Into<String>) -> Self {
54        Self {
55            code,
56            message: message.into(),
57        }
58    }
59
60    pub fn code_str(&self) -> &'static str {
61        self.code.as_str()
62    }
63}
64
65impl Display for MessagingError {
66    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
67        write!(f, "{} ({})", self.message, self.code_str())
68    }
69}
70
71impl std::error::Error for MessagingError {}
72
73pub type MessagingResult<T> = Result<T, MessagingError>;
74
75pub fn invalid_argument(message: impl Into<String>) -> MessagingError {
76    MessagingError::new(MessagingErrorCode::InvalidArgument, message)
77}
78
79pub fn internal_error(message: impl Into<String>) -> MessagingError {
80    MessagingError::new(MessagingErrorCode::Internal, message)
81}
82
83pub fn token_deletion_failed(message: impl Into<String>) -> MessagingError {
84    MessagingError::new(MessagingErrorCode::TokenDeletionFailed, message)
85}
86
87pub fn permission_blocked(message: impl Into<String>) -> MessagingError {
88    MessagingError::new(MessagingErrorCode::PermissionBlocked, message)
89}
90
91pub fn available_in_window(message: impl Into<String>) -> MessagingError {
92    MessagingError::new(MessagingErrorCode::AvailableInWindow, message)
93}
94
95pub fn available_in_service_worker(message: impl Into<String>) -> MessagingError {
96    MessagingError::new(MessagingErrorCode::AvailableInServiceWorker, message)
97}
98
99pub fn unsupported_browser(message: impl Into<String>) -> MessagingError {
100    MessagingError::new(MessagingErrorCode::UnsupportedBrowser, message)
101}
102
103pub fn failed_default_registration(message: impl Into<String>) -> MessagingError {
104    MessagingError::new(MessagingErrorCode::FailedDefaultRegistration, message)
105}
106
107pub fn invalid_service_worker_registration(message: impl Into<String>) -> MessagingError {
108    MessagingError::new(
109        MessagingErrorCode::InvalidServiceWorkerRegistration,
110        message,
111    )
112}
113
114pub fn token_subscribe_failed(message: impl Into<String>) -> MessagingError {
115    MessagingError::new(MessagingErrorCode::TokenSubscribeFailed, message)
116}
117
118pub fn token_unsubscribe_failed(message: impl Into<String>) -> MessagingError {
119    MessagingError::new(MessagingErrorCode::TokenUnsubscribeFailed, message)
120}
121
122pub fn token_subscribe_no_token() -> MessagingError {
123    MessagingError::new(
124        MessagingErrorCode::TokenSubscribeNoToken,
125        "FCM returned no token when subscribing the user to push.",
126    )
127}
128
129pub fn token_update_failed(message: impl Into<String>) -> MessagingError {
130    MessagingError::new(MessagingErrorCode::TokenUpdateFailed, message)
131}
132
133pub fn token_update_no_token() -> MessagingError {
134    MessagingError::new(
135        MessagingErrorCode::TokenUpdateNoToken,
136        "FCM returned no token when updating the user to push.",
137    )
138}