#![doc = include_str!("../README.md")]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![allow(clippy::type_complexity)]
#![allow(clippy::collapsible_else_if)]
use bevy::ecs::component::Component;
use bevy::ecs::query::{QueryData, QueryFilter};
use bevy::ecs::world::EntityRef;
mod extractors;
pub use extractors::*;
mod children;
pub use children::{Child, ChildVec, ChildrenLike};
mod batch;
mod childmap;
pub use childmap::{ChildMap, ChildMapLike};
mod extensions;
mod root;
pub use batch::{BatchSerialization, Join, SerializeWorld};
pub use extensions::{InWorld, SerializeLens, WorldExtension};
pub use root::RootObject;
mod adjacent;
pub use adjacent::{Adjacent, SerializeAdjacent};
pub mod asset;
mod filter;
pub mod interning;
pub mod typetagged;
mod util;
pub use filter::EntityFilter;
pub use util::*;
#[cfg(any(feature = "linkme", doc))]
#[cfg_attr(docsrs, doc(cfg(feature = "linkme")))]
pub mod linking;
#[allow(unused)]
use bevy::asset::Handle;
#[allow(unused)]
use bevy::ecs::hierarchy::Children;
#[doc(hidden)]
pub use bevy::ecs::{
entity::Entity,
query::With,
world::{EntityWorldMut, World},
};
#[doc(hidden)]
pub use bevy::reflect::TypePath;
#[doc(hidden)]
pub use serde;
#[allow(unused)]
use serde::{Deserialize, Serialize, de::DeserializeOwned};
pub use bevy_serde_lens_core::{DeUtils, SerUtils};
#[cfg(feature = "derive")]
pub use bevy_serde_lens_derive::BevyObject;
pub trait ZstInit: Sized {
fn init() -> Self;
}
#[doc(hidden)]
pub type Item<'t, T> = <<<T as BevyObject>::Data as QueryData>::ReadOnly as QueryData>::Item<'t, 't>;
#[doc(hidden)]
pub type BindItem<'t, T> =
<<<T as BindProjectQuery>::Data as QueryData>::ReadOnly as QueryData>::Item<'t, 't>;
pub trait BevyObject {
type Object: Serialize + DeserializeOwned + ZstInit;
const IS_QUERY: bool;
type Data: QueryData;
type Filter: EntityFilter;
#[allow(unused)]
fn get_root(world: &mut World) -> Option<EntityWorldMut> {
None
}
fn name() -> &'static str;
fn init() -> Self::Object {
Self::Object::init()
}
fn filter(entity: &EntityRef) -> bool {
Self::Filter::filter(entity)
}
#[allow(unused_variables)]
fn into_ser(query_data: Item<'_, Self>) -> impl Serialize {}
}
impl<T> BevyObject for T
where
T: Component + Serialize + DeserializeOwned + TypePath,
{
const IS_QUERY: bool = true;
type Object = SerializeComponent<T>;
type Data = &'static T;
type Filter = With<T>;
fn name() -> &'static str {
T::short_type_path()
}
fn into_ser(query_data: Item<'_, Self>) -> impl Serialize {
query_data
}
}
pub trait BindProject {
type To: ZstInit;
type Filter: QueryFilter;
}
pub trait BindProjectQuery {
type Data: QueryData;
}
impl<T> BindProject for T
where
T: BevyObject,
{
type To = T::Object;
type Filter = T::Filter;
}
impl<T> BindProjectQuery for T
where
T: BevyObject,
{
type Data = T::Data;
}
#[macro_export]
macro_rules! batch {
($($tt:tt)*) => {
$crate::batch_inner!($($tt)*)
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! batch_inner {
($ty: ty $(,)?) => {
$ty
};
($a: ty, $b: ty $(,)?) => {
$crate::Join<$a, $b>
};
($first: ty $(,$ty: ty)* $(,)?) => {
$crate::Join<$first, $crate::batch_inner!($($ty),*)>
};
}
#[doc(hidden)]
pub use std::format;