From ae49b22650356d9d9a5051772d9e6119972d4731 Mon Sep 17 00:00:00 2001 From: nab138 Date: Mon, 2 Feb 2026 10:23:57 -0500 Subject: [PATCH] Return actual enum for DeveloperErrors to allow programatic error handling --- isideload/src/dev/developer_session.rs | 34 ++++++++++++-------------- isideload/src/lib.rs | 3 +++ 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/isideload/src/dev/developer_session.rs b/isideload/src/dev/developer_session.rs index b28398d..a5ee76d 100644 --- a/isideload/src/dev/developer_session.rs +++ b/isideload/src/dev/developer_session.rs @@ -8,6 +8,7 @@ use tracing::{error, warn}; use uuid::Uuid; use crate::{ + SideloadError, anisette::AnisetteDataGenerator, auth::{ apple_account::{AppToken, AppleAccount}, @@ -68,7 +69,7 @@ impl DeveloperSession { &mut self, url: &str, body: impl Into>, - ) -> Result<(Dictionary, Option), Report> { + ) -> Result<(Dictionary, Option), Report> { let body = body.into().unwrap_or_else(Dictionary::new); let base = plist!(dict { @@ -108,27 +109,23 @@ impl DeveloperSession { // 2. We return server errors if the expected data is missing // 3. We return parsing errors if there is no server error but the expected data is missing let response_code = dict.get("resultCode").and_then(|v| v.as_signed_integer()); - let mut server_error: Option = None; + let mut server_error: Option = None; if let Some(code) = response_code { if code != 0 { - let user_string = dict - .get("userString") - .and_then(|v| v.as_string()) - .unwrap_or("Developer request failed."); - let result_string = dict .get("resultString") .and_then(|v| v.as_string()) .unwrap_or("No error message given."); + let user_string = dict + .get("userString") + .and_then(|v| v.as_string()) + .unwrap_or(result_string); + server_error = Some(SideloadError::DeveloperError(code, user_string.to_string())); - // if user and result string match, only show one - if user_string == result_string { - server_error = Some(format!("{} Code: {}", user_string, code)); - } else { - server_error = - Some(format!("{} Code: {}; {}", user_string, code, result_string)); - } - error!(server_error); + error!( + "Developer request returned error code {}: {} ({})", + code, user_string, result_string + ); } } else { warn!("No resultCode in developer request response"); @@ -148,9 +145,10 @@ impl DeveloperSession { let result: Result = dict.get_struct(response_key); if result.is_err() - && let Some(err) = server_error { - bail!(err); - } + && let Some(err) = server_error + { + bail!(err); + } Ok(result.context("Failed to extract developer request result")?) } diff --git a/isideload/src/lib.rs b/isideload/src/lib.rs index 14a1c66..54eb968 100644 --- a/isideload/src/lib.rs +++ b/isideload/src/lib.rs @@ -18,6 +18,9 @@ pub enum SideloadError { #[error("Failed to get anisette data, anisette not provisioned")] AnisetteNotProvisioned, + + #[error("Developer error {0}: {1}")] + DeveloperError(i64, String), } struct ReqwestErrorFormatter;