Skip to content

Commit

Permalink
Merge pull request #8 from flipt-io/remove-anyhow-error
Browse files Browse the repository at this point in the history
feat: remove anyhow errors from Rust lib
  • Loading branch information
yquansah authored Jan 8, 2024

Verified

This commit was signed with the committer’s verified signature.
squid233 squid233
2 parents d92934d + 8f293a5 commit 605e148
Showing 7 changed files with 86 additions and 24 deletions.
7 changes: 0 additions & 7 deletions flipt-client-rust/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion flipt-client-rust/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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"] }
3 changes: 1 addition & 2 deletions flipt-client-rust/examples/evaluations.rs
Original file line number Diff line number Diff line change
@@ -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<dyn std::error::Error>> {
let client = FliptClient::default();

let mut context: HashMap<String, String> = HashMap::new();
39 changes: 39 additions & 0 deletions flipt-client-rust/src/error.rs
Original file line number Diff line number Diff line change
@@ -12,6 +12,26 @@ pub struct UpstreamError {
pub details: Option<Vec<serde_json::Value>>,
}

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)
}
}
29 changes: 22 additions & 7 deletions flipt-client-rust/src/evaluation/mod.rs
Original file line number Diff line number Diff line change
@@ -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,32 +21,47 @@ impl Evaluation {
pub async fn boolean(
&self,
request: &EvaluationRequest,
) -> anyhow::Result<BooleanEvaluationResponse> {
) -> Result<BooleanEvaluationResponse, UpstreamError> {
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
}

pub async fn variant(
&self,
request: &EvaluationRequest,
) -> anyhow::Result<VariantEvaluationResponse> {
) -> Result<VariantEvaluationResponse, UpstreamError> {
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
}

pub async fn batch(
&self,
batch: &BatchEvaluationRequest,
) -> anyhow::Result<BatchEvaluationResponse> {
) -> Result<BatchEvaluationResponse, UpstreamError> {
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
}
13 changes: 10 additions & 3 deletions flipt-client-rust/src/lib.rs
Original file line number Diff line number Diff line change
@@ -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<Self> {
pub fn new(url: Url, token: String, timeout: u64) -> Result<Self, ClientError> {
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),
18 changes: 14 additions & 4 deletions flipt-client-rust/src/util/mod.rs
Original file line number Diff line number Diff line change
@@ -2,10 +2,20 @@ use crate::error::UpstreamError;

pub async fn deserialize<T: serde::de::DeserializeOwned>(
resp: reqwest::Response,
) -> anyhow::Result<T> {
) -> Result<T, UpstreamError> {
if resp.status().is_success() {
return Ok(resp.json::<T>().await?);
match resp.json::<T>().await {
Ok(t) => {
return Ok(t);
}
Err(err) => {
return Err(UpstreamError::default_with_message(err.to_string()));
}
}
}

match resp.json::<UpstreamError>().await {
Ok(ue) => Err(ue),
Err(err) => Err(UpstreamError::default_with_message(err.to_string())),
}
let parsed_err = resp.json::<UpstreamError>().await?;
Err(anyhow::Error::new(parsed_err))
}

0 comments on commit 605e148

Please sign in to comment.