use std::future::Future;
pub async fn retry_async<'a, Fut, F, Args, Out, ErrOut>(
max_retries: u64,
func: Fut,
args: &'a Args,
) -> Result<Out, ErrOut>
where
Fut: Fn(&'a Args) -> F,
F: Future<Output = Result<Out, ErrOut>>,
ErrOut: std::fmt::Debug,
{
if max_retries == 0 {
panic!("Max retries cannot be 0");
}
let mut count: u64 = 0;
let mut result: Result<Out, ErrOut> = func(args).await;
while count < max_retries - 1 && result.is_err() {
let executed_func = func(args);
result = executed_func.await;
if result.is_ok() {
return result;
}
count += 1;
}
result
}
pub fn retry_sync<'a, F, Args, Out, ErrOut>(
max_retries: u64,
func: F,
args: &'a Args,
) -> Result<Out, ErrOut>
where
F: Fn(&'a Args) -> Result<Out, ErrOut>,
ErrOut: std::fmt::Debug,
{
if max_retries == 0 {
panic!("Max retries cannot be 0");
}
let mut count: u64 = 0;
let mut result: Result<Out, ErrOut> = func(args);
while count < max_retries - 1 && result.is_err() {
let executed_func = func(args);
result = executed_func;
if result.is_ok() {
return result;
}
count += 1;
}
result
}
#[derive(Clone, Debug)]
pub enum ReadJsonTreeError {
JsonNotFound,
}
#[derive(Clone, Debug)]
pub enum ReadJsonTreeSteps<'a> {
Key(&'a str),
Index(usize),
}
pub fn read_json_tree<'a>(
json_value: &'a serde_json::Value,
path: &Vec<ReadJsonTreeSteps>,
) -> Result<&'a serde_json::Value, ReadJsonTreeError> {
let mut actual_value: &serde_json::Value = json_value;
for step in path {
match step {
ReadJsonTreeSteps::Key(key) => {
actual_value = actual_value
.get(key)
.ok_or(ReadJsonTreeError::JsonNotFound)?;
}
ReadJsonTreeSteps::Index(index) => {
actual_value = actual_value
.get(*index)
.ok_or(ReadJsonTreeError::JsonNotFound)?;
}
}
}
Ok(actual_value)
}
#[cfg(feature = "debug")]
pub fn deserialize_from_value<T>(value: serde_json::Value) -> Result<T, String>
where
T: serde::de::DeserializeOwned,
{
let json_string = serde_json::to_string(&value).unwrap();
let jd = &mut serde_json::Deserializer::from_str(&json_string);
let result: Result<T, _> = serde_path_to_error::deserialize(jd);
match result {
Ok(customer) => Ok(customer),
Err(err) => Err(format!(
"Error parsing JSON at {}: {}",
err.path(),
err.inner()
)),
}
}
#[cfg(not(feature = "debug"))]
pub fn deserialize_from_value<T>(value: serde_json::Value) -> Result<T, String>
where
T: serde::de::DeserializeOwned,
{
let result: Result<T, _> = serde_json::from_value(value);
match result {
Ok(customer) => Ok(customer),
Err(err) => Err(format!("Error parsing JSON: {}", err)),
}
}
#[cfg(feature = "debug")]
pub fn deserialize_from_str<T>(json_string: &str) -> Result<T, String>
where
T: serde::de::DeserializeOwned,
{
let value: serde_json::Value = serde_json::from_str(json_string).unwrap();
deserialize_from_value(value)
}
#[cfg(not(feature = "debug"))]
pub fn deserialize_from_str<T>(json_string: &str) -> Result<T, String>
where
T: serde::de::DeserializeOwned,
{
use serde_json::Error;
let value: serde_json::Value = serde_json::from_str(json_string).unwrap();
let result: Result<T, Error> = serde_json::from_value(value);
match result {
Ok(customer) => Ok(customer),
Err(err) => Err(format!("Error parsing JSON: {}", err)),
}
}