use elicitation::{elicit_newtype, elicit_newtype_traits};
use elicitation_derive::reflect_methods;
use std::sync::Arc;
elicit_newtype!(bevy::scene::SceneInstanceReady, as SceneInstanceReady);
elicit_newtype_traits!(SceneInstanceReady, bevy::scene::SceneInstanceReady, [eq]);
impl serde::Serialize for SceneInstanceReady {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
use serde::ser::SerializeMap;
let mut map = serializer.serialize_map(Some(2))?;
map.serialize_entry("entity_bits", &self.0.entity.to_bits())?;
map.serialize_entry("instance_id", &format!("{:?}", self.0.instance_id))?;
map.end()
}
}
impl<'de> serde::Deserialize<'de> for SceneInstanceReady {
fn deserialize<D: serde::Deserializer<'de>>(_deserializer: D) -> Result<Self, D::Error> {
Err(serde::de::Error::custom(
"SceneInstanceReady cannot be deserialized; observe it via the ECS event system",
))
}
}
impl From<SceneInstanceReady> for bevy::scene::SceneInstanceReady {
fn from(v: SceneInstanceReady) -> Self {
Arc::try_unwrap(v.0).unwrap_or_else(|arc| *arc)
}
}
#[reflect_methods]
impl SceneInstanceReady {
#[tracing::instrument(skip(self))]
pub fn entity_bits(&self) -> u64 {
self.0.entity.to_bits()
}
#[tracing::instrument(skip(self))]
pub fn instance_id_string(&self) -> String {
format!("{:?}", self.0.instance_id)
}
}
mod emit_impls {
use super::SceneInstanceReady;
use elicitation::emit_code::ToCodeLiteral;
use proc_macro2::TokenStream;
impl ToCodeLiteral for SceneInstanceReady {
fn to_code_literal(&self) -> TokenStream {
let bits = self.0.entity.to_bits();
quote::quote! {
compile_error!(
"SceneInstanceReady cannot be constructed as a code literal; \
observe it via the ECS event system instead."
);
let _ = #bits;
}
}
}
}
impl elicitation::ElicitComplete for SceneInstanceReady {}
elicit_newtype!(bevy::ecs::name::Name, as Name, forward_serde);
elicit_newtype_traits!(Name, bevy::ecs::name::Name, []);
impl From<Name> for bevy::ecs::name::Name {
fn from(v: Name) -> Self {
Arc::try_unwrap(v.0).unwrap_or_else(|arc| (*arc).clone())
}
}
#[reflect_methods]
impl Name {
#[tracing::instrument(skip(self))]
pub fn as_str(&self) -> &str {
self.0.as_str()
}
}
mod emit_name {
use super::Name;
use elicitation::emit_code::ToCodeLiteral;
use proc_macro2::TokenStream;
impl ToCodeLiteral for Name {
fn to_code_literal(&self) -> TokenStream {
let s = self.0.as_str();
quote::quote! { ::bevy::ecs::name::Name::new(#s) }
}
}
}
impl elicitation::ElicitComplete for Name {}