Documentation
use std::{any::Any, sync::Arc};

use jav::DynContext;

use crate::{
	DI, DIK,
	scope::{Scope, ScopeProvider},
};

#[async_trait::async_trait]
impl<T: 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::sp() 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: 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::sp() else {
			return None;
		};
		let scope = crate::scope::get_default_scope_full();
		let Ok(service) = sp.dis(scope) else {
			return None;
		};
		Some(DIK(service, std::marker::PhantomData))
	}
}