use std::marker::PhantomData;
use amethyst_assets::PrefabData;
use amethyst_core::ecs::{
shred::{ResourceId, SystemData},
Component, Entities, Entity, Join, NullStorage, ReadStorage, World, WriteStorage,
};
use amethyst_derive::PrefabData;
use amethyst_error::Error;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize, PrefabData)]
#[serde(default)]
#[prefab(Component)]
pub struct Tag<T>
where
T: Clone + Send + Sync + 'static,
{
_m: PhantomData<T>,
}
impl<T> Default for Tag<T>
where
T: Clone + Send + Sync + 'static,
{
fn default() -> Self {
Tag { _m: PhantomData }
}
}
impl<T> Component for Tag<T>
where
T: Clone + Send + Sync + 'static,
{
type Storage = NullStorage<Self>;
}
#[derive(SystemData)]
#[allow(missing_debug_implementations)]
pub struct TagFinder<'a, T>
where
T: Clone + Send + Sync + 'static,
{
pub entities: Entities<'a>,
pub tags: ReadStorage<'a, Tag<T>>,
}
impl<'a, T> TagFinder<'a, T>
where
T: Clone + Send + Sync + 'static,
{
pub fn find(&self) -> Option<Entity> {
(&*self.entities, &self.tags)
.join()
.map(|(entity, _)| entity)
.next()
}
}