#[derive(Debug, Clone, Copy, PartialEq)]
pub enum JsonErrorKind {
InternalError,
MaintenanceMode,
UrlParamMissingMethod,
UrlParamMissingAuthToken,
UrlParamMissingPartnerId,
UrlParamMissingUserId,
SecureProtocolRequired,
CertificateRequired,
ParameterTypeMismatch,
ParameterMissing,
ParameterValueInvalid,
ApiVersionNotSupported,
LicensingRestrictions,
InsufficientConnectivity,
UnknownMethodName,
WrongProtocol,
ReadOnlyMode,
InvalidAuthToken,
InvalidPartnerLogin,
ListenerNotAuthorized,
UserNotAuthorized,
MaxStationsReached,
StationDoesNotExist,
ComplimentaryPeriodAlreadyInUse,
CallNotAllowed,
DeviceNotFound,
PartnerNotAuthorized,
InvalidUsername,
InvalidPassword,
UsernameAlreadyExists,
DeviceAlreadyAssociatedToAccount,
UpgradeDeviceModelInvalid,
ExplicitPinIncorrect,
ExplicitPinMalformed,
DeviceModelInvalid,
ZipCodeInvalid,
BirthYearInvalid,
BirthYearTooYoung,
InvalidCountryCode,
InvalidGender,
DeviceDisabled,
DailyTrialLimitReached,
InvalidSponsor,
UserAlreadyUsedTrial,
PlaylistExceeded,
UnknownErrorCode(u32),
UnknownErrorMessage,
}
impl From<u32> for JsonErrorKind {
fn from(code: u32) -> Self {
match code {
0 => JsonErrorKind::InternalError,
1 => JsonErrorKind::MaintenanceMode,
2 => JsonErrorKind::UrlParamMissingMethod,
3 => JsonErrorKind::UrlParamMissingAuthToken,
4 => JsonErrorKind::UrlParamMissingPartnerId,
5 => JsonErrorKind::UrlParamMissingUserId,
6 => JsonErrorKind::SecureProtocolRequired,
7 => JsonErrorKind::CertificateRequired,
8 => JsonErrorKind::ParameterTypeMismatch,
9 => JsonErrorKind::ParameterMissing,
10 => JsonErrorKind::ParameterValueInvalid,
11 => JsonErrorKind::ApiVersionNotSupported,
12 => JsonErrorKind::LicensingRestrictions,
13 => JsonErrorKind::InsufficientConnectivity,
14 => JsonErrorKind::UnknownMethodName,
15 => JsonErrorKind::WrongProtocol,
1000 => JsonErrorKind::ReadOnlyMode,
1001 => JsonErrorKind::InvalidAuthToken,
1002 => JsonErrorKind::InvalidPartnerLogin,
1003 => JsonErrorKind::ListenerNotAuthorized,
1004 => JsonErrorKind::UserNotAuthorized,
1005 => JsonErrorKind::MaxStationsReached,
1006 => JsonErrorKind::StationDoesNotExist,
1007 => JsonErrorKind::ComplimentaryPeriodAlreadyInUse,
1008 => JsonErrorKind::CallNotAllowed,
1009 => JsonErrorKind::DeviceNotFound,
1010 => JsonErrorKind::PartnerNotAuthorized,
1011 => JsonErrorKind::InvalidUsername,
1012 => JsonErrorKind::InvalidPassword,
1013 => JsonErrorKind::UsernameAlreadyExists,
1014 => JsonErrorKind::DeviceAlreadyAssociatedToAccount,
1015 => JsonErrorKind::UpgradeDeviceModelInvalid,
1018 => JsonErrorKind::ExplicitPinIncorrect,
1020 => JsonErrorKind::ExplicitPinMalformed,
1023 => JsonErrorKind::DeviceModelInvalid,
1024 => JsonErrorKind::ZipCodeInvalid,
1025 => JsonErrorKind::BirthYearInvalid,
1026 => JsonErrorKind::BirthYearTooYoung,
1027 => JsonErrorKind::InvalidCountryCode,
1034 => JsonErrorKind::DeviceDisabled,
1035 => JsonErrorKind::DailyTrialLimitReached,
1036 => JsonErrorKind::InvalidSponsor,
1037 => JsonErrorKind::UserAlreadyUsedTrial,
1039 => JsonErrorKind::PlaylistExceeded,
x => JsonErrorKind::UnknownErrorCode(x),
}
}
}
impl std::fmt::Display for JsonErrorKind {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
JsonErrorKind::InternalError => write!(f, "Internal"),
JsonErrorKind::MaintenanceMode => write!(f, "Maintenance Mode"),
JsonErrorKind::UrlParamMissingMethod => write!(f, "Url Param Missing Method"),
JsonErrorKind::UrlParamMissingAuthToken => write!(f, "Url Param Missing Auth Token"),
JsonErrorKind::UrlParamMissingPartnerId => write!(f, "Url Param Missing Partner ID"),
JsonErrorKind::UrlParamMissingUserId => write!(f, "Url Param Missing User ID"),
JsonErrorKind::SecureProtocolRequired => write!(f, "Secure Protocol Required"),
JsonErrorKind::CertificateRequired => write!(f, "Certificate Required"),
JsonErrorKind::ParameterTypeMismatch => write!(f, "Parameter Type Mismatch"),
JsonErrorKind::ParameterMissing => write!(f, "Parameter Missing."),
JsonErrorKind::ParameterValueInvalid => write!(f, "Parameter Value Invalid"),
JsonErrorKind::ApiVersionNotSupported => write!(f, "API Version Not Supported"),
JsonErrorKind::LicensingRestrictions => write!(f, "Licensing Restriction"),
JsonErrorKind::InsufficientConnectivity => write!(f, "Insufficient Connectivity"),
JsonErrorKind::UnknownMethodName => write!(f, "Unknown Method Name"),
JsonErrorKind::WrongProtocol => write!(f, "Incorrect Protocol"),
JsonErrorKind::ReadOnlyMode => write!(f, "Read Only Mode"),
JsonErrorKind::InvalidAuthToken => write!(f, "Invalid Auth Token"),
JsonErrorKind::InvalidPartnerLogin => write!(f, "Invalid Partner Login"),
JsonErrorKind::ListenerNotAuthorized => write!(f, "Listener Not Authorized"),
JsonErrorKind::UserNotAuthorized => write!(f, "User Not Authorized"),
JsonErrorKind::MaxStationsReached => write!(f, "Max Stations Reached"),
JsonErrorKind::StationDoesNotExist => write!(f, "Station Does Not Exist"),
JsonErrorKind::ComplimentaryPeriodAlreadyInUse => {
write!(f, "Complimentary Period Already In Use")
}
JsonErrorKind::CallNotAllowed => write!(f, "Call Not Allowed"),
JsonErrorKind::DeviceNotFound => write!(f, "Device Not Found"),
JsonErrorKind::PartnerNotAuthorized => write!(f, "Partner Not Authorized"),
JsonErrorKind::InvalidUsername => write!(f, "Invalid Username"),
JsonErrorKind::InvalidPassword => write!(f, "Invalid Password"),
JsonErrorKind::UsernameAlreadyExists => write!(f, "Username Already Exists"),
JsonErrorKind::DeviceAlreadyAssociatedToAccount => {
write!(f, "Device Already Associated to Account")
}
JsonErrorKind::UpgradeDeviceModelInvalid => write!(f, "Upgrade Device Model Invalid"),
JsonErrorKind::ExplicitPinIncorrect => write!(f, "Explicit Pin Incorrect"),
JsonErrorKind::ExplicitPinMalformed => write!(f, "Explicit Pin Malformed"),
JsonErrorKind::DeviceModelInvalid => write!(f, "Device Model Invalid"),
JsonErrorKind::ZipCodeInvalid => write!(f, "Zip Code Invalid"),
JsonErrorKind::BirthYearInvalid => write!(f, "Birth Year Invalid"),
JsonErrorKind::BirthYearTooYoung => write!(f, "Birth Year Too Young"),
JsonErrorKind::InvalidCountryCode => write!(f, "Invalid Country Code"),
JsonErrorKind::InvalidGender => write!(f, "Invalid Gender"),
JsonErrorKind::DeviceDisabled => write!(f, "Device Disabled"),
JsonErrorKind::DailyTrialLimitReached => write!(f, "Daily Trial Limit Reached"),
JsonErrorKind::InvalidSponsor => write!(f, "Invalid Sponsor"),
JsonErrorKind::UserAlreadyUsedTrial => write!(f, "User Already Used Trial"),
JsonErrorKind::PlaylistExceeded => write!(
f,
"Playlist Exceeded. Too many requests for a new playlist."
),
JsonErrorKind::UnknownErrorCode(x) => write!(f, "Unrecognized Error Code ({})", x),
JsonErrorKind::UnknownErrorMessage => write!(f, "Missing Error Code."),
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct JsonError {
pub(crate) kind: JsonErrorKind,
pub(crate) message: Option<String>,
}
impl JsonError {
pub fn new(code: Option<u32>, message: Option<String>) -> Self {
let kind = match code {
Some(code) => JsonErrorKind::from(code),
None => JsonErrorKind::UnknownErrorMessage,
};
JsonError { kind, message }
}
pub fn kind(&self) -> JsonErrorKind {
self.kind
}
}
impl std::error::Error for JsonError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
None
}
}
impl std::fmt::Display for JsonError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "Pandora API Call Error ({} Error)", self.kind)?;
if let Some(msg) = &self.message {
write!(f, ": {}", msg)?;
}
Ok(())
}
}