From b8fbf2651ef9c831f7d06b7b2b8c75e1b82b3f1b Mon Sep 17 00:00:00 2001 From: Joey Hines Date: Sat, 14 Jun 2025 12:06:54 -0600 Subject: [PATCH] Add more error handling on response messages --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/lib.rs | 25 ++++++++++++++++++------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index faad84a..0328221 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -101,7 +101,7 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cta-api" -version = "0.3.0" +version = "0.4.0" dependencies = [ "reqwest", "serde", diff --git a/Cargo.toml b/Cargo.toml index bd6702e..8410b41 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cta-api" -version = "0.3.0" +version = "0.4.0" edition = "2024" description = "CTA API Client" authors = ["Joey Hines joey@ahines.net"] diff --git a/src/lib.rs b/src/lib.rs index 7ad8285..f804a4a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,7 +2,7 @@ use crate::models::eta::{EtaRequest, EtaResp}; use crate::models::follow::{FollowRequest, FollowResp}; use crate::models::route::{RouteRequest, RouteResp}; use crate::models::{CTAResponse, Response}; -use reqwest::{Client, Url}; +use reqwest::{Client, StatusCode, Url}; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -18,8 +18,12 @@ pub enum Error { ReqwestFailure(#[from] reqwest::Error), #[error("URL parse failure: {0}")] UrlParseError(#[from] url::ParseError), - #[error("Got error number '{0}': {1}")] + #[error("Got error number '{1}': {0}")] CtaError(String, String), + #[error("Got a bad HTTP response code: '{0}'")] + HttpError(u16), + #[error("Got a bad response body: '{0}'")] + BadResponse(String), } pub struct CTAClient { @@ -44,20 +48,27 @@ impl CTAClient { ) -> Result { let url = self.url.join(endpoint)?; - let resp: Response = self + let resp = self .client .get(url) .query(&req) .query(&[("outputType", "JSON")]) .query(&[("key", &self.key)]) .send() - .await? - .json() .await?; - resp.ctatt.check_error()?; + if resp.status() == StatusCode::OK { + let resp_str = resp.text().await?; - Ok(resp.ctatt) + let resp: Response = + serde_json::from_str(&resp_str).map_err(|_| Error::BadResponse(resp_str))?; + + resp.ctatt.check_error()?; + + Ok(resp.ctatt) + } else { + Err(Error::HttpError(resp.status().as_u16())) + } } pub async fn fetch_route(&mut self, route: &str) -> Result {