
# Objective - Contributes to #15460 ## Solution - Added `std` feature (enabled by default) ## Testing - CI - `cargo check -p bevy_reflect --no-default-features --target "x86_64-unknown-none"` - UEFI demo application runs with this branch of `bevy_reflect`, allowing `derive(Reflect)` ## Notes - The [`spin`](https://crates.io/crates/spin) crate has been included to provide `RwLock` and `Once` (as an alternative to `OnceLock`) when the `std` feature is not enabled. Another alternative may be more desirable, please provide feedback if you have a strong opinion here! - Certain items (`Box`, `String`, `ToString`) provided by `alloc` have been added to `__macro_exports` as a way to avoid `alloc` vs `std` namespacing. I'm personally quite annoyed that we can't rely on `alloc` as a crate name in `std` environments within macros. I'd love an alternative to my approach here, but I suspect it's the least-bad option. - I would've liked to have an `alloc` feature (for allocation-free `bevy_reflect`), unfortunately, `erased_serde` unconditionally requires access to `Box`. Maybe one day we could design around this, but for now it just means `bevy_reflect` requires `alloc`. --------- Co-authored-by: Gino Valente <49806985+MrGVSV@users.noreply.github.com> Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
65 lines
2.3 KiB
Rust
65 lines
2.3 KiB
Rust
use crate::Reflect;
|
|
|
|
/// Marks a type as a [reflectable] wrapper for a remote type.
|
|
///
|
|
/// This allows types from external libraries (remote types) to be included in reflection.
|
|
///
|
|
/// # Safety
|
|
///
|
|
/// It is highly recommended to avoid implementing this trait manually and instead use the
|
|
/// [`#[reflect_remote]`](crate::reflect_remote) attribute macro.
|
|
/// This is because the trait tends to rely on [`transmute`], which is [very unsafe].
|
|
///
|
|
/// The macro will ensure that the following safety requirements are met:
|
|
/// - `Self` is a single-field tuple struct (i.e. a newtype) containing the remote type.
|
|
/// - `Self` is `#[repr(transparent)]` over the remote type.
|
|
///
|
|
/// Additionally, the macro will automatically generate [`Reflect`] and [`FromReflect`] implementations,
|
|
/// along with compile-time assertions to validate that the safety requirements have been met.
|
|
///
|
|
/// # Example
|
|
///
|
|
/// ```
|
|
/// use bevy_reflect_derive::{reflect_remote, Reflect};
|
|
///
|
|
/// mod some_lib {
|
|
/// pub struct TheirType {
|
|
/// pub value: u32
|
|
/// }
|
|
/// }
|
|
///
|
|
/// #[reflect_remote(some_lib::TheirType)]
|
|
/// struct MyType {
|
|
/// pub value: u32
|
|
/// }
|
|
///
|
|
/// #[derive(Reflect)]
|
|
/// struct MyStruct {
|
|
/// #[reflect(remote = MyType)]
|
|
/// data: some_lib::TheirType,
|
|
/// }
|
|
/// ```
|
|
///
|
|
/// [reflectable]: Reflect
|
|
/// [`transmute`]: core::mem::transmute
|
|
/// [very unsafe]: https://doc.rust-lang.org/1.71.0/nomicon/transmutes.html
|
|
/// [`FromReflect`]: crate::FromReflect
|
|
pub trait ReflectRemote: Reflect {
|
|
/// The remote type this type represents via reflection.
|
|
type Remote;
|
|
|
|
/// Converts a reference of this wrapper to a reference of its remote type.
|
|
fn as_remote(&self) -> &Self::Remote;
|
|
/// Converts a mutable reference of this wrapper to a mutable reference of its remote type.
|
|
fn as_remote_mut(&mut self) -> &mut Self::Remote;
|
|
/// Converts this wrapper into its remote type.
|
|
fn into_remote(self) -> Self::Remote;
|
|
|
|
/// Converts a reference of the remote type to a reference of this wrapper.
|
|
fn as_wrapper(remote: &Self::Remote) -> &Self;
|
|
/// Converts a mutable reference of the remote type to a mutable reference of this wrapper.
|
|
fn as_wrapper_mut(remote: &mut Self::Remote) -> &mut Self;
|
|
/// Converts the remote type into this wrapper.
|
|
fn into_wrapper(remote: Self::Remote) -> Self;
|
|
}
|