Add more error handling on response messages
This commit is contained in:
parent
353eb865db
commit
b8fbf2651e
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -101,7 +101,7 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cta-api"
|
name = "cta-api"
|
||||||
version = "0.3.0"
|
version = "0.4.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "cta-api"
|
name = "cta-api"
|
||||||
version = "0.3.0"
|
version = "0.4.0"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
description = "CTA API Client"
|
description = "CTA API Client"
|
||||||
authors = ["Joey Hines joey@ahines.net"]
|
authors = ["Joey Hines joey@ahines.net"]
|
||||||
|
25
src/lib.rs
25
src/lib.rs
@ -2,7 +2,7 @@ use crate::models::eta::{EtaRequest, EtaResp};
|
|||||||
use crate::models::follow::{FollowRequest, FollowResp};
|
use crate::models::follow::{FollowRequest, FollowResp};
|
||||||
use crate::models::route::{RouteRequest, RouteResp};
|
use crate::models::route::{RouteRequest, RouteResp};
|
||||||
use crate::models::{CTAResponse, Response};
|
use crate::models::{CTAResponse, Response};
|
||||||
use reqwest::{Client, Url};
|
use reqwest::{Client, StatusCode, Url};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
@ -18,8 +18,12 @@ pub enum Error {
|
|||||||
ReqwestFailure(#[from] reqwest::Error),
|
ReqwestFailure(#[from] reqwest::Error),
|
||||||
#[error("URL parse failure: {0}")]
|
#[error("URL parse failure: {0}")]
|
||||||
UrlParseError(#[from] url::ParseError),
|
UrlParseError(#[from] url::ParseError),
|
||||||
#[error("Got error number '{0}': {1}")]
|
#[error("Got error number '{1}': {0}")]
|
||||||
CtaError(String, String),
|
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 {
|
pub struct CTAClient {
|
||||||
@ -44,20 +48,27 @@ impl CTAClient {
|
|||||||
) -> Result<V, Error> {
|
) -> Result<V, Error> {
|
||||||
let url = self.url.join(endpoint)?;
|
let url = self.url.join(endpoint)?;
|
||||||
|
|
||||||
let resp: Response<V> = self
|
let resp = self
|
||||||
.client
|
.client
|
||||||
.get(url)
|
.get(url)
|
||||||
.query(&req)
|
.query(&req)
|
||||||
.query(&[("outputType", "JSON")])
|
.query(&[("outputType", "JSON")])
|
||||||
.query(&[("key", &self.key)])
|
.query(&[("key", &self.key)])
|
||||||
.send()
|
.send()
|
||||||
.await?
|
|
||||||
.json()
|
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
resp.ctatt.check_error()?;
|
if resp.status() == StatusCode::OK {
|
||||||
|
let resp_str = resp.text().await?;
|
||||||
|
|
||||||
Ok(resp.ctatt)
|
let resp: Response<V> =
|
||||||
|
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<RouteResp, Error> {
|
pub async fn fetch_route(&mut self, route: &str) -> Result<RouteResp, Error> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user