1use std::path::Path;
2use async_trait::async_trait;
3
4pub trait MaybeThrow {
7
8 type Error;
9
10 fn maybe_throw(&self) -> Result<(),Self::Error>;
11}
12
13#[async_trait]
15pub trait AsyncTryFrom<X> {
16 type Error;
17
18 async fn new(input: &X) -> Result<Self, Self::Error>
19 where
20 Self: Sized; }
22
23#[async_trait]
25pub trait AsyncCreateWithAndValidate<X>:
26 Sized
27 + AsyncTryFrom<X>
28 + ValidateIntegrity<Error=<Self as AsyncTryFrom<X>>::Error> where for<'async_trait> X: Send + Sync + 'async_trait
30{
31 async fn new_and_validate(input: &X) -> Result<Self, <Self as AsyncTryFrom<X>>::Error> {
33 let instance = Self::new(&input).await?;
34 instance.validate_integrity().await?; Ok(instance)
36 }
37}
38
39impl<X, T> AsyncCreateWithAndValidate<X> for T
42where
43 for<'async_trait> X: Send + Sync + 'async_trait,
44 T: AsyncTryFrom<X> + ValidateIntegrity<Error=<T as AsyncTryFrom<X>>::Error>, {
46 }
48
49#[async_trait]
50pub trait AsyncPathValidator {
51
52 async fn is_valid(path: &Path) -> bool;
53}
54
55#[async_trait]
56pub trait AsyncFindItems {
57
58 type Item;
59 type Error;
60
61 async fn find_items(path: &Path) -> Result<Vec<Self::Item>, Self::Error>;
63}
64
65#[async_trait]
67pub trait ValidateIntegrity {
68
69 type Error;
70
71 async fn validate_integrity(&self) -> Result<(), Self::Error>;
72}
73
74#[async_trait]
76pub trait AsyncTryFromEnv {
77 type Error;
78
79 async fn new_from_env(var_name: &str) -> Result<Self, Self::Error>
81 where
82 Self: Sized;
83}
84
85#[async_trait]
87pub trait AsyncTryFromFile {
88 type Error;
89
90 async fn new_from_file(path: &Path) -> Result<Self, Self::Error>
92 where
93 Self: Sized;
94}
95
96#[async_trait]
98pub trait AsyncCreateWithAndValidateEnv:
99 Sized
100 + AsyncTryFromEnv
101 + ValidateIntegrity<Error = <Self as AsyncTryFromEnv>::Error>
102{
103 async fn new_from_env_and_validate(var_name: &str) -> Result<Self, <Self as AsyncTryFromEnv>::Error> {
104 let instance = Self::new_from_env(var_name).await?;
105 instance.validate_integrity().await?;
106 Ok(instance)
107 }
108}
109
110impl<T> AsyncCreateWithAndValidateEnv for T
112where
113 T: AsyncTryFromEnv + ValidateIntegrity<Error = <T as AsyncTryFromEnv>::Error>,
114{}
115
116#[async_trait]
118pub trait AsyncCreateWithAndValidateFile:
119 Sized
120 + AsyncTryFromFile
121 + ValidateIntegrity<Error = <Self as AsyncTryFromFile>::Error>
122{
123 async fn new_from_file_and_validate(path: &Path) -> Result<Self, <Self as AsyncTryFromFile>::Error> {
124 let instance = Self::new_from_file(path).await?;
125 instance.validate_integrity().await?;
126 Ok(instance)
127 }
128}
129
130impl<T> AsyncCreateWithAndValidateFile for T
132where
133 T: AsyncTryFromFile + ValidateIntegrity<Error = <T as AsyncTryFromFile>::Error>,
134{}