Documentation
use std::sync::Arc;

use jav::DynContext;

use crate::{DI, DIK};

#[async_trait::async_trait]
impl<T: ?Sized + Send + Sync + 'static, E: Send + Sync + 'static> jav::FromEvent<E> for DI<T> {
	async fn from_event(_event: Arc<E>, _extensions: &DynContext) -> Option<Self> {
		let Some(sp) = crate::spo() else {
			return None;
		};
		let scope = crate::scope::get_default_scope_full();
		let Ok(service) = sp.dis(scope) else {
			return None;
		};
		Some(DI(service))
	}
}

#[async_trait::async_trait]
impl<T: ?Sized + Send + Sync + 'static, E: Send + Sync + 'static, K: Send + Sync + 'static>
	jav::FromEvent<E> for DIK<T, K>
{
	async fn from_event(_event: Arc<E>, _extensions: &DynContext) -> Option<Self> {
		let Some(sp) = crate::spo() else {
			return None;
		};
		let scope = crate::scope::get_default_scope_full();
		let Ok(service) = sp.disk::<T, K>(scope) else {
			return None;
		};
		Some(DIK(service, std::marker::PhantomData))
	}
}