From e3f6caf3914c89502bf9002a746f0db42c986f83 Mon Sep 17 00:00:00 2001 From: Danila Malyutin Date: Mon, 4 Aug 2025 19:40:35 +0400 Subject: [PATCH] Report Jira errors returned by the REST API --- src/access.rs | 34 +++++++++++++++++++++++----------- src/errors.rs | 2 ++ src/issue_model.rs | 7 +++++++ 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/access.rs b/src/access.rs index 359e6ca..4c9d712 100644 --- a/src/access.rs +++ b/src/access.rs @@ -19,7 +19,7 @@ limitations under the License. // * https://docs.atlassian.com/jira-software/REST/latest/ use crate::errors::JiraQueryError; -use crate::issue_model::{Issue, JqlResults}; +use crate::issue_model::{Issue, JiraErrorMessages, JqlResults}; // The prefix of every subsequent REST request. // This string comes directly after the host in the URL. @@ -170,11 +170,19 @@ impl JiraInstance { let url = self.path(&Method::Key(key), 0); // Gets an issue by ID and deserializes the JSON to data variable - let issue = self.authenticated_get(&url).await?.json::().await?; + let response = self.authenticated_get(&url).await?; - log::debug!("{:#?}", issue); + if response.status().is_success() { + let issue = response.json::().await?; - Ok(issue) + log::debug!("{:#?}", issue); + + Ok(issue) + } else { + Err(JiraQueryError::JiraError( + response.json::().await?.error_messages, + )) + } } /// Access several issues by their keys. @@ -251,15 +259,19 @@ impl JiraInstance { ) -> Result, JiraQueryError> { let url = self.path(method, start_at); - let results = self - .authenticated_get(&url) - .await? - .json::() - .await?; + let response = self.authenticated_get(&url).await?; - log::debug!("{:#?}", results); + if response.status().is_success() { + let results = response.json::().await?; - Ok(results.issues) + log::debug!("{:#?}", results); + + Ok(results.issues) + } else { + Err(JiraQueryError::JiraError( + response.json::().await?.error_messages, + )) + } } /// Access issues using a free-form JQL search. diff --git a/src/errors.rs b/src/errors.rs index 67136fa..9fbaa66 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -25,4 +25,6 @@ pub enum JiraQueryError { NoIssues, #[error("Error in accessing the Jira REST API.")] Request(#[from] reqwest::Error), + #[error("Error in accessing the Jira REST API: {}", .0.join(", "))] + JiraError(Vec), } diff --git a/src/issue_model.rs b/src/issue_model.rs index 6a7c7e0..4bd44ab 100644 --- a/src/issue_model.rs +++ b/src/issue_model.rs @@ -432,3 +432,10 @@ pub struct Security { #[serde(flatten)] pub extra: Value, } + +/// Error messages returned by Jira REST API. +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] +pub struct JiraErrorMessages { + #[serde(rename = "errorMessages")] + pub error_messages : Vec +}