1#[derive(Debug, Clone, Copy, PartialEq)]
8pub enum JsonErrorKind {
9 InternalError,
12 MaintenanceMode,
14 UrlParamMissingMethod,
16 UrlParamMissingAuthToken,
18 UrlParamMissingPartnerId,
20 UrlParamMissingUserId,
22 SecureProtocolRequired,
24 CertificateRequired,
26 ParameterTypeMismatch,
28 ParameterMissing,
31 ParameterValueInvalid,
33 ApiVersionNotSupported,
35 LicensingRestrictions,
37 InsufficientConnectivity,
39 UnknownMethodName,
41 WrongProtocol,
43 ReadOnlyMode,
45 InvalidAuthToken,
47 InvalidPartnerLogin,
50 ListenerNotAuthorized,
53 UserNotAuthorized,
56 MaxStationsReached,
58 StationDoesNotExist,
60 ComplimentaryPeriodAlreadyInUse,
62 CallNotAllowed,
65 DeviceNotFound,
67 PartnerNotAuthorized,
69 InvalidUsername,
71 InvalidPassword,
73 UsernameAlreadyExists,
75 DeviceAlreadyAssociatedToAccount,
77 UpgradeDeviceModelInvalid,
79 ExplicitPinIncorrect,
81 ExplicitPinMalformed,
83 DeviceModelInvalid,
85 ZipCodeInvalid,
87 BirthYearInvalid,
89 BirthYearTooYoung,
91 InvalidCountryCode,
93 InvalidGender,
95 DeviceDisabled,
97 DailyTrialLimitReached,
99 InvalidSponsor,
101 UserAlreadyUsedTrial,
103 PlaylistExceeded,
105 UnknownErrorCode(u32),
107 UnknownErrorMessage,
109}
110
111impl From<u32> for JsonErrorKind {
112 fn from(code: u32) -> Self {
114 match code {
115 0 => JsonErrorKind::InternalError,
116 1 => JsonErrorKind::MaintenanceMode,
117 2 => JsonErrorKind::UrlParamMissingMethod,
118 3 => JsonErrorKind::UrlParamMissingAuthToken,
119 4 => JsonErrorKind::UrlParamMissingPartnerId,
120 5 => JsonErrorKind::UrlParamMissingUserId,
121 6 => JsonErrorKind::SecureProtocolRequired,
122 7 => JsonErrorKind::CertificateRequired,
123 8 => JsonErrorKind::ParameterTypeMismatch,
124 9 => JsonErrorKind::ParameterMissing,
125 10 => JsonErrorKind::ParameterValueInvalid,
126 11 => JsonErrorKind::ApiVersionNotSupported,
127 12 => JsonErrorKind::LicensingRestrictions,
128 13 => JsonErrorKind::InsufficientConnectivity,
129 14 => JsonErrorKind::UnknownMethodName,
130 15 => JsonErrorKind::WrongProtocol,
131 1000 => JsonErrorKind::ReadOnlyMode,
132 1001 => JsonErrorKind::InvalidAuthToken,
133 1002 => JsonErrorKind::InvalidPartnerLogin,
134 1003 => JsonErrorKind::ListenerNotAuthorized,
135 1004 => JsonErrorKind::UserNotAuthorized,
136 1005 => JsonErrorKind::MaxStationsReached,
137 1006 => JsonErrorKind::StationDoesNotExist,
138 1007 => JsonErrorKind::ComplimentaryPeriodAlreadyInUse,
139 1008 => JsonErrorKind::CallNotAllowed,
140 1009 => JsonErrorKind::DeviceNotFound,
141 1010 => JsonErrorKind::PartnerNotAuthorized,
142 1011 => JsonErrorKind::InvalidUsername,
143 1012 => JsonErrorKind::InvalidPassword,
144 1013 => JsonErrorKind::UsernameAlreadyExists,
145 1014 => JsonErrorKind::DeviceAlreadyAssociatedToAccount,
146 1015 => JsonErrorKind::UpgradeDeviceModelInvalid,
147 1018 => JsonErrorKind::ExplicitPinIncorrect,
148 1020 => JsonErrorKind::ExplicitPinMalformed,
149 1023 => JsonErrorKind::DeviceModelInvalid,
150 1024 => JsonErrorKind::ZipCodeInvalid,
151 1025 => JsonErrorKind::BirthYearInvalid,
152 1026 => JsonErrorKind::BirthYearTooYoung,
153 1027 => JsonErrorKind::InvalidCountryCode,
155 1034 => JsonErrorKind::DeviceDisabled,
157 1035 => JsonErrorKind::DailyTrialLimitReached,
158 1036 => JsonErrorKind::InvalidSponsor,
159 1037 => JsonErrorKind::UserAlreadyUsedTrial,
160 1039 => JsonErrorKind::PlaylistExceeded,
161 x => JsonErrorKind::UnknownErrorCode(x),
162 }
163 }
164}
165
166impl std::fmt::Display for JsonErrorKind {
176 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
178 match self {
179 JsonErrorKind::InternalError => write!(f, "Internal"),
181 JsonErrorKind::MaintenanceMode => write!(f, "Maintenance Mode"),
182 JsonErrorKind::UrlParamMissingMethod => write!(f, "Url Param Missing Method"),
183 JsonErrorKind::UrlParamMissingAuthToken => write!(f, "Url Param Missing Auth Token"),
184 JsonErrorKind::UrlParamMissingPartnerId => write!(f, "Url Param Missing Partner ID"),
185 JsonErrorKind::UrlParamMissingUserId => write!(f, "Url Param Missing User ID"),
186 JsonErrorKind::SecureProtocolRequired => write!(f, "Secure Protocol Required"),
187 JsonErrorKind::CertificateRequired => write!(f, "Certificate Required"),
188 JsonErrorKind::ParameterTypeMismatch => write!(f, "Parameter Type Mismatch"),
189 JsonErrorKind::ParameterMissing => write!(f, "Parameter Missing."),
190 JsonErrorKind::ParameterValueInvalid => write!(f, "Parameter Value Invalid"),
191 JsonErrorKind::ApiVersionNotSupported => write!(f, "API Version Not Supported"),
192 JsonErrorKind::LicensingRestrictions => write!(f, "Licensing Restriction"),
193 JsonErrorKind::InsufficientConnectivity => write!(f, "Insufficient Connectivity"),
194 JsonErrorKind::UnknownMethodName => write!(f, "Unknown Method Name"),
195 JsonErrorKind::WrongProtocol => write!(f, "Incorrect Protocol"),
196 JsonErrorKind::ReadOnlyMode => write!(f, "Read Only Mode"),
197 JsonErrorKind::InvalidAuthToken => write!(f, "Invalid Auth Token"),
198 JsonErrorKind::InvalidPartnerLogin => write!(f, "Invalid Partner Login"),
199 JsonErrorKind::ListenerNotAuthorized => write!(f, "Listener Not Authorized"),
200 JsonErrorKind::UserNotAuthorized => write!(f, "User Not Authorized"),
201 JsonErrorKind::MaxStationsReached => write!(f, "Max Stations Reached"),
202 JsonErrorKind::StationDoesNotExist => write!(f, "Station Does Not Exist"),
203 JsonErrorKind::ComplimentaryPeriodAlreadyInUse => {
204 write!(f, "Complimentary Period Already In Use")
205 }
206 JsonErrorKind::CallNotAllowed => write!(f, "Call Not Allowed"),
207 JsonErrorKind::DeviceNotFound => write!(f, "Device Not Found"),
208 JsonErrorKind::PartnerNotAuthorized => write!(f, "Partner Not Authorized"),
209 JsonErrorKind::InvalidUsername => write!(f, "Invalid Username"),
210 JsonErrorKind::InvalidPassword => write!(f, "Invalid Password"),
211 JsonErrorKind::UsernameAlreadyExists => write!(f, "Username Already Exists"),
212 JsonErrorKind::DeviceAlreadyAssociatedToAccount => {
213 write!(f, "Device Already Associated to Account")
214 }
215 JsonErrorKind::UpgradeDeviceModelInvalid => write!(f, "Upgrade Device Model Invalid"),
216 JsonErrorKind::ExplicitPinIncorrect => write!(f, "Explicit Pin Incorrect"),
217 JsonErrorKind::ExplicitPinMalformed => write!(f, "Explicit Pin Malformed"),
218 JsonErrorKind::DeviceModelInvalid => write!(f, "Device Model Invalid"),
219 JsonErrorKind::ZipCodeInvalid => write!(f, "Zip Code Invalid"),
220 JsonErrorKind::BirthYearInvalid => write!(f, "Birth Year Invalid"),
221 JsonErrorKind::BirthYearTooYoung => write!(f, "Birth Year Too Young"),
222 JsonErrorKind::InvalidCountryCode => write!(f, "Invalid Country Code"),
223 JsonErrorKind::InvalidGender => write!(f, "Invalid Gender"),
224 JsonErrorKind::DeviceDisabled => write!(f, "Device Disabled"),
225 JsonErrorKind::DailyTrialLimitReached => write!(f, "Daily Trial Limit Reached"),
226 JsonErrorKind::InvalidSponsor => write!(f, "Invalid Sponsor"),
227 JsonErrorKind::UserAlreadyUsedTrial => write!(f, "User Already Used Trial"),
228 JsonErrorKind::PlaylistExceeded => write!(
229 f,
230 "Playlist Exceeded. Too many requests for a new playlist."
231 ),
232 JsonErrorKind::UnknownErrorCode(x) => write!(f, "Unrecognized Error Code ({x})"),
233 JsonErrorKind::UnknownErrorMessage => write!(f, "Missing Error Code."),
234 }
235 }
236}
237
238#[derive(Debug, Clone, PartialEq)]
240pub struct JsonError {
241 pub(crate) kind: JsonErrorKind,
242 pub(crate) message: Option<String>,
243}
244
245impl JsonError {
246 pub fn new(code: Option<u32>, message: Option<String>) -> Self {
248 let kind = match code {
249 Some(code) => JsonErrorKind::from(code),
250 None => JsonErrorKind::UnknownErrorMessage,
251 };
252 JsonError { kind, message }
253 }
254
255 pub fn kind(&self) -> JsonErrorKind {
257 self.kind
258 }
259}
260
261impl std::error::Error for JsonError {
262 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
264 None
265 }
266}
267
268impl std::fmt::Display for JsonError {
269 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
271 write!(f, "Pandora API Call Error ({} Error)", self.kind)?;
272 if let Some(msg) = &self.message {
273 write!(f, ": {msg}")?;
274 }
275 Ok(())
276 }
277}