use std::path::Path;
use async_trait::async_trait;
pub trait MaybeThrow {
type Error;
fn maybe_throw(&self) -> Result<(),Self::Error>;
}
#[async_trait]
pub trait AsyncTryFrom<X> {
type Error;
async fn new(input: &X) -> Result<Self, Self::Error>
where
Self: Sized; }
#[async_trait]
pub trait AsyncCreateWithAndValidate<X>:
Sized
+ AsyncTryFrom<X>
+ ValidateIntegrity<Error=<Self as AsyncTryFrom<X>>::Error> where for<'async_trait> X: Send + Sync + 'async_trait
{
async fn new_and_validate(input: &X) -> Result<Self, <Self as AsyncTryFrom<X>>::Error> {
let instance = Self::new(&input).await?;
instance.validate_integrity()?; Ok(instance)
}
}
impl<X, T> AsyncCreateWithAndValidate<X> for T
where
for<'async_trait> X: Send + Sync + 'async_trait,
T: AsyncTryFrom<X> + ValidateIntegrity<Error=<T as AsyncTryFrom<X>>::Error>, {
}
#[async_trait]
pub trait AsyncPathValidator {
async fn is_valid(path: &Path) -> bool;
}
#[async_trait]
pub trait AsyncFindItems {
type Item;
type Error;
async fn find_items(path: &Path) -> Result<Vec<Self::Item>, Self::Error>;
}
pub trait ValidateIntegrity {
type Error;
fn validate_integrity(&self) -> Result<(), Self::Error>;
}
#[async_trait]
pub trait AsyncTryFromEnv {
type Error;
async fn new_from_env(var_name: &str) -> Result<Self, Self::Error>
where
Self: Sized;
}
#[async_trait]
pub trait AsyncTryFromFile {
type Error;
async fn new_from_file(path: &Path) -> Result<Self, Self::Error>
where
Self: Sized;
}
#[async_trait]
pub trait AsyncCreateWithAndValidateEnv:
Sized
+ AsyncTryFromEnv
+ ValidateIntegrity<Error = <Self as AsyncTryFromEnv>::Error>
{
async fn new_from_env_and_validate(var_name: &str) -> Result<Self, <Self as AsyncTryFromEnv>::Error> {
let instance = Self::new_from_env(var_name).await?;
instance.validate_integrity()?;
Ok(instance)
}
}
impl<T> AsyncCreateWithAndValidateEnv for T
where
T: AsyncTryFromEnv + ValidateIntegrity<Error = <T as AsyncTryFromEnv>::Error>,
{}
#[async_trait]
pub trait AsyncCreateWithAndValidateFile:
Sized
+ AsyncTryFromFile
+ ValidateIntegrity<Error = <Self as AsyncTryFromFile>::Error>
{
async fn new_from_file_and_validate(path: &Path) -> Result<Self, <Self as AsyncTryFromFile>::Error> {
let instance = Self::new_from_file(path).await?;
instance.validate_integrity()?;
Ok(instance)
}
}
impl<T> AsyncCreateWithAndValidateFile for T
where
T: AsyncTryFromFile + ValidateIntegrity<Error = <T as AsyncTryFromFile>::Error>,
{}