From 8f293a58217d3f664cb7b3c9d7bde83c50392b69 Mon Sep 17 00:00:00 2001 From: Yoofi Quansah Date: Mon, 8 Jan 2024 08:15:31 -0600 Subject: [PATCH] feat: remove anyhow errors from Rust lib --- flipt-client-rust/Cargo.lock | 7 ---- flipt-client-rust/Cargo.toml | 1 - flipt-client-rust/examples/evaluations.rs | 3 +- flipt-client-rust/src/error.rs | 39 +++++++++++++++++++++++ flipt-client-rust/src/evaluation/mod.rs | 29 +++++++++++++---- flipt-client-rust/src/lib.rs | 13 ++++++-- flipt-client-rust/src/util/mod.rs | 18 ++++++++--- 7 files changed, 86 insertions(+), 24 deletions(-) diff --git a/flipt-client-rust/Cargo.lock b/flipt-client-rust/Cargo.lock index 16adebb..d547d99 100644 --- a/flipt-client-rust/Cargo.lock +++ b/flipt-client-rust/Cargo.lock @@ -32,12 +32,6 @@ dependencies = [ "libc", ] -[[package]] -name = "anyhow" -version = "1.0.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" - [[package]] name = "autocfg" version = "1.1.0" @@ -146,7 +140,6 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" name = "flipt" version = "0.0.1" dependencies = [ - "anyhow", "chrono", "reqwest", "serde", diff --git a/flipt-client-rust/Cargo.toml b/flipt-client-rust/Cargo.toml index da86c3a..656b7f4 100644 --- a/flipt-client-rust/Cargo.toml +++ b/flipt-client-rust/Cargo.toml @@ -8,7 +8,6 @@ license = "MIT" keywords = ["flipt"] [dependencies] -anyhow = "1.0.66" chrono = { version = "0.4.23", default-features = false, features = ["serde", "clock"] } reqwest = { version = "0.11.13", default-features = false, features = ["json", "rustls-tls"] } serde = { version = "1.0.147", features = ["derive"] } diff --git a/flipt-client-rust/examples/evaluations.rs b/flipt-client-rust/examples/evaluations.rs index 721ec2c..211100f 100644 --- a/flipt-client-rust/examples/evaluations.rs +++ b/flipt-client-rust/examples/evaluations.rs @@ -2,12 +2,11 @@ use std::collections::HashMap; -use anyhow::Result; use flipt::evaluation::models::{BatchEvaluationRequest, EvaluationRequest}; use flipt::FliptClient; #[tokio::main] -async fn main() -> Result<()> { +async fn main() -> Result<(), Box> { let client = FliptClient::default(); let mut context: HashMap = HashMap::new(); diff --git a/flipt-client-rust/src/error.rs b/flipt-client-rust/src/error.rs index 432d989..4544646 100644 --- a/flipt-client-rust/src/error.rs +++ b/flipt-client-rust/src/error.rs @@ -12,6 +12,26 @@ pub struct UpstreamError { pub details: Option>, } +impl Default for UpstreamError { + fn default() -> Self { + Self { + code: 0, + message: "internal error".into(), + details: Some(Vec::new()), + } + } +} + +impl UpstreamError { + pub fn default_with_message(message: String) -> Self { + Self { + code: 0, + message, + details: Some(Vec::new()), + } + } +} + impl Error for UpstreamError {} impl Display for UpstreamError { @@ -26,3 +46,22 @@ impl Display for UpstreamError { Ok(()) } } + +#[derive(Debug, Clone)] +pub struct ClientError { + pub message: String, +} + +impl ClientError { + pub fn new(message: String) -> Self { + Self { message } + } +} + +impl Error for ClientError {} + +impl Display for ClientError { + fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { + write!(f, "Client error: {}", self.message) + } +} diff --git a/flipt-client-rust/src/evaluation/mod.rs b/flipt-client-rust/src/evaluation/mod.rs index f6737f1..a869cd2 100644 --- a/flipt-client-rust/src/evaluation/mod.rs +++ b/flipt-client-rust/src/evaluation/mod.rs @@ -1,6 +1,6 @@ pub mod models; -use crate::util::deserialize; +use crate::{error::UpstreamError, util::deserialize}; use models::{ BatchEvaluationRequest, BatchEvaluationResponse, BooleanEvaluationResponse, EvaluationRequest, VariantEvaluationResponse, @@ -21,10 +21,15 @@ impl Evaluation { pub async fn boolean( &self, request: &EvaluationRequest, - ) -> anyhow::Result { + ) -> Result { let endpoint = format!("{}evaluate/v1/boolean", self.url.as_str()); - let response = self.client.post(endpoint).json(request).send().await?; + let response = match self.client.post(endpoint).json(request).send().await { + Ok(r) => r, + Err(e) => { + return Err(UpstreamError::default_with_message(e.to_string())); + } + }; deserialize(response).await } @@ -32,10 +37,15 @@ impl Evaluation { pub async fn variant( &self, request: &EvaluationRequest, - ) -> anyhow::Result { + ) -> Result { let endpoint = format!("{}evaluate/v1/variant", self.url.as_str()); - let response = self.client.post(endpoint).json(request).send().await?; + let response = match self.client.post(endpoint).json(request).send().await { + Ok(r) => r, + Err(e) => { + return Err(UpstreamError::default_with_message(e.to_string())); + } + }; deserialize(response).await } @@ -43,10 +53,15 @@ impl Evaluation { pub async fn batch( &self, batch: &BatchEvaluationRequest, - ) -> anyhow::Result { + ) -> Result { let endpoint = format!("{}evaluate/v1/batch", self.url.as_str()); - let response = self.client.post(endpoint).json(batch).send().await?; + let response = match self.client.post(endpoint).json(batch).send().await { + Ok(r) => r, + Err(e) => { + return Err(UpstreamError::default_with_message(e.to_string())); + } + }; deserialize(response).await } diff --git a/flipt-client-rust/src/lib.rs b/flipt-client-rust/src/lib.rs index 020173e..35ecf87 100644 --- a/flipt-client-rust/src/lib.rs +++ b/flipt-client-rust/src/lib.rs @@ -2,6 +2,7 @@ pub mod error; pub mod evaluation; pub mod util; +use error::ClientError; use evaluation::Evaluation; use reqwest::header::HeaderMap; use std::time::Duration; @@ -12,7 +13,7 @@ pub struct FliptClient { } impl FliptClient { - pub fn new(url: Url, token: String, timeout: u64) -> anyhow::Result { + pub fn new(url: Url, token: String, timeout: u64) -> Result { let mut header_map = HeaderMap::new(); if !token.is_empty() { @@ -22,10 +23,16 @@ impl FliptClient { ); } - let client = reqwest::Client::builder() + let client = match reqwest::Client::builder() .timeout(Duration::from_secs(timeout)) .default_headers(header_map) - .build()?; + .build() + { + Ok(client) => client, + Err(e) => { + return Err(ClientError::new(e.to_string())); + } + }; Ok(Self { evaluation: Evaluation::new(client, url), diff --git a/flipt-client-rust/src/util/mod.rs b/flipt-client-rust/src/util/mod.rs index bde065a..52b55f8 100644 --- a/flipt-client-rust/src/util/mod.rs +++ b/flipt-client-rust/src/util/mod.rs @@ -2,10 +2,20 @@ use crate::error::UpstreamError; pub async fn deserialize( resp: reqwest::Response, -) -> anyhow::Result { +) -> Result { if resp.status().is_success() { - return Ok(resp.json::().await?); + match resp.json::().await { + Ok(t) => { + return Ok(t); + } + Err(err) => { + return Err(UpstreamError::default_with_message(err.to_string())); + } + } + } + + match resp.json::().await { + Ok(ue) => Err(ue), + Err(err) => Err(UpstreamError::default_with_message(err.to_string())), } - let parsed_err = resp.json::().await?; - Err(anyhow::Error::new(parsed_err)) }