use std::{any::{Any, TypeId}, cell::{Ref, RefMut}};
use super::{Entities, ComponentError, query::QueryError};
pub struct QueryEntity<'a> {
pub id: usize,
entities: &'a Entities,
}
impl<'a> QueryEntity<'a> {
pub fn new(index: usize, entities: &'a Entities) -> Self {
Self { id: index, entities }
}
pub fn get_component<T: Any>(&self) -> eyre::Result<Ref<T>> {
let typeid = TypeId::of::<T>();
let components = self.entities.components.get(&typeid).ok_or(ComponentError::UnregisteredComponentError)?;
let component = components.get(self.id)
.ok_or(QueryError::OutOfBoundsIdError)?
.as_ref()
.ok_or(ComponentError::NonexistentComponentDataError)?;
let borrow = component.borrow();
Ok(
Ref::map(borrow, |any| {
any.downcast_ref::<T>().unwrap()
})
)
}
pub fn get_component_mut<T: Any>(&self) -> eyre::Result<RefMut<T>> {
let typeid = TypeId::of::<T>();
let components = self.entities.components.get(&typeid).ok_or(ComponentError::UnregisteredComponentError)?;
let component = components.get(self.id)
.ok_or(QueryError::OutOfBoundsIdError)?
.as_ref()
.ok_or(ComponentError::NonexistentComponentDataError)?;
let borrow = component.borrow_mut();
Ok(
RefMut::map(borrow, |any| {
any.downcast_mut::<T>().unwrap()
})
)
}
}