#[cfg(feature = "container")]
#[async_trait::async_trait]
pub trait AsyncProvider<T>: Send + Sync {
async fn provide_async(&self) -> crate::result::hex_result::HexResult<T>;
}
#[cfg(all(test, feature = "container"))]
mod tests {
struct AsyncTestService {
value: i32,
}
struct AsyncTestProvider {
value: i32,
}
#[async_trait::async_trait]
impl crate::container::async_provider::AsyncProvider<AsyncTestService> for AsyncTestProvider {
async fn provide_async(&self) -> crate::result::hex_result::HexResult<AsyncTestService> {
tokio::time::sleep(std::time::Duration::from_millis(10)).await;
Ok(AsyncTestService { value: self.value })
}
}
#[tokio::test]
async fn test_async_provider_creates_instance() {
let provider = AsyncTestProvider { value: 42 };
let service = <AsyncTestProvider as crate::container::async_provider::AsyncProvider<
AsyncTestService,
>>::provide_async(&provider)
.await
.unwrap();
assert_eq!(service.value, 42);
}
#[tokio::test]
async fn test_async_provider_concurrent_creation() {
let handle1 = tokio::spawn({
let p = AsyncTestProvider { value: 10 };
async move {
<AsyncTestProvider as crate::container::async_provider::AsyncProvider<AsyncTestService>>::provide_async(&p).await
}
});
let handle2 = tokio::spawn({
let p = AsyncTestProvider { value: 10 };
async move {
<AsyncTestProvider as crate::container::async_provider::AsyncProvider<AsyncTestService>>::provide_async(&p).await
}
});
let result1 = handle1.await.unwrap().unwrap();
let result2 = handle2.await.unwrap().unwrap();
assert_eq!(result1.value, 10);
assert_eq!(result2.value, 10);
}
}