use std::any::TypeId;
use std::sync::Weak;
use crate::registry::{DependencyRegistry, DependencyScope, FactoryTrait};
pub struct OverrideGuard {
pub(crate) type_id: TypeId,
pub(crate) previous: Option<(Box<dyn FactoryTrait>, DependencyScope)>,
pub(crate) registry: Weak<DependencyRegistry>,
}
impl OverrideGuard {
pub fn type_id(&self) -> TypeId {
self.type_id
}
}
impl Drop for OverrideGuard {
fn drop(&mut self) {
let Some(registry) = self.registry.upgrade() else {
return;
};
match self.previous.take() {
Some((factory, scope)) => {
registry.restore_override(self.type_id, factory, scope);
}
None => {
registry.remove_override(self.type_id);
}
}
}
}
const _: fn() = || {
fn _assert<T: Send + Sync>() {}
_assert::<OverrideGuard>();
};