use elicitation::{elicit_newtype, elicit_newtype_traits};
use elicitation_derive::reflect_methods;
use std::sync::Arc;
elicit_newtype!(bevy::ecs::entity::Entity, as Entity);
elicit_newtype_traits!(Entity, bevy::ecs::entity::Entity, [cmp]);
impl serde::Serialize for Entity {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
(*self.0).serialize(serializer)
}
}
impl<'de> serde::Deserialize<'de> for Entity {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
bevy::ecs::entity::Entity::deserialize(deserializer).map(|e| Entity(Arc::new(e)))
}
}
impl From<Entity> for bevy::ecs::entity::Entity {
fn from(v: Entity) -> Self {
*v.0
}
}
#[reflect_methods]
impl Entity {
#[tracing::instrument(skip(self))]
pub fn index_u32(&self) -> u32 {
self.0.index_u32()
}
#[tracing::instrument(skip(self))]
pub fn generation(&self) -> u32 {
self.0.generation().to_bits()
}
#[tracing::instrument(skip(self))]
pub fn bits(&self) -> u64 {
self.0.to_bits()
}
#[tracing::instrument(skip(self))]
pub fn is_placeholder(&self) -> bool {
*self.0 == bevy::ecs::entity::Entity::PLACEHOLDER
}
#[tracing::instrument(skip(self))]
pub fn from_bits_constructor(&self, bits: u64) -> Entity {
Entity(Arc::new(bevy::ecs::entity::Entity::from_bits(bits)))
}
#[tracing::instrument(skip(self))]
pub fn from_raw_constructor(&self, index: u32) -> Option<Entity> {
bevy::ecs::entity::Entity::from_raw_u32(index).map(|e| Entity(Arc::new(e)))
}
}
mod emit_impls {
use super::Entity;
use elicitation::emit_code::ToCodeLiteral;
use proc_macro2::TokenStream;
impl ToCodeLiteral for Entity {
fn to_code_literal(&self) -> TokenStream {
let bits = self.0.to_bits();
quote::quote! {
::elicit_bevy::Entity::from(
::bevy::ecs::entity::Entity::from_bits(#bits)
)
}
}
}
}
impl elicitation::ElicitComplete for Entity {}