mirror_mirror/
lib.rs

1//! General purpose reflection library for Rust.
2//!
3//! # Examples
4//!
5//! ## Access a field by its string name and mutate it
6//!
7//! ```
8//! use mirror_mirror::{Reflect, Struct};
9//!
10//! #[derive(Reflect, Clone, Debug)]
11//! struct Foo {
12//!     x: i32,
13//! }
14//!
15//! let mut foo = Foo { x: 42 };
16//!
17//! # (|| {
18//! // Get a `Struct` trait object for `Foo`.
19//! //
20//! // The `Struct` trait has methods available for all structs such as accessing
21//! // fields by name and iterating over the fields.
22//! let struct_obj: &mut dyn Struct = foo.as_struct_mut()?;
23//!
24//! // Mutably borrow the `x` field. We can access fields using string names.
25//! let x: &mut dyn Reflect = struct_obj.field_mut("x")?;
26//!
27//! // Downcast `x` into a mutable `i32`
28//! let x: &mut i32 = x.downcast_mut::<i32>()?;
29//!
30//! // Change the value of `x`
31//! *x += 1;
32//!
33//! // The value of `x` in `foo` has now changed.
34//! assert_eq!(foo.x, 43);
35//! # Some(())
36//! # })().unwrap();
37//! ```
38//!
39//! ## Iterate over all fields
40//!
41//! ```
42//! use mirror_mirror::{Reflect, Struct, ReflectMut, ScalarMut, enum_::VariantFieldMut};
43//!
44//! // A function that iterates over the fields in an enum and mutates them.
45//! fn change_enum_fields(value: &mut dyn Reflect) -> Option<()> {
46//!     let enum_ = value.as_enum_mut()?;
47//!
48//!     for field in enum_.fields_mut() {
49//!         match field {
50//!             VariantFieldMut::Struct(_, value) | VariantFieldMut::Tuple(value) => {
51//!                 match value.reflect_mut() {
52//!                     ReflectMut::Scalar(ScalarMut::i32(n)) => {
53//!                         *n *= 2;
54//!                     }
55//!                     ReflectMut::Scalar(ScalarMut::String(s)) => {
56//!                         *s = format!("{s}bar");
57//!                     }
58//!                     // Ignore other types
59//!                     _ =>  {}
60//!                 }
61//!             }
62//!         }
63//!     }
64//!
65//!     Some(())
66//! }
67//!
68//! #[derive(Reflect, Clone, Debug)]
69//! enum Bar {
70//!     X { x: i32 },
71//!     Y(String),
72//! }
73//!
74//! # (|| {
75//! let mut bar = Bar::X { x: 42 };
76//! change_enum_fields(bar.as_reflect_mut())?;
77//!
78//! assert!(matches!(bar, Bar::X { x: 84 }));
79//!
80//! let mut bar = Bar::Y("foo".to_owned());
81//! change_enum_fields(bar.as_reflect_mut())?;
82//!
83//! assert!(matches!(bar, Bar::Y(s) if s == "foobar"));
84//! # Some(())
85//! # })().unwrap();
86//! ```
87//!
88//! ## Query value and type information using key paths
89//!
90//! ```
91//! use mirror_mirror::{
92//!     Reflect,
93//!     key_path,
94//!     key_path::{GetPath, GetTypePath, field},
95//!     type_info::{DescribeType, ScalarType},
96//! };
97//!
98//! // Some complex nested data type.
99//! #[derive(Reflect, Clone, Debug)]
100//! struct User {
101//!     employer: Option<Company>,
102//! }
103//!
104//! #[derive(Reflect, Clone, Debug)]
105//! struct Company {
106//!     countries: Vec<Country>,
107//! }
108//!
109//! #[derive(Reflect, Clone, Debug)]
110//! struct Country {
111//!     name: String
112//! }
113//!
114//! let user = User {
115//!     employer: Some(Company {
116//!         countries: vec![Country {
117//!             name: "Denmark".to_owned(),
118//!         }],
119//!     }),
120//! };
121//!
122//! // Build a key path that represents accessing `.employer::Some.0.countries[0].name`.
123//! //
124//! // `::Some` means to access the `Some` variant of `Option<Company>`.
125//! let path = field("employer").variant("Some").field(0).field("countries").get(0).field("name");
126//!
127//! // Get the value at the key path.
128//! assert_eq!(user.get_at::<String>(&path).unwrap(), "Denmark");
129//!
130//! // Key paths can also be constructed using the `key_path!` macro.
131//! // This invocation expands the same code we have above.
132//! let path = key_path!(.employer::Some.0.countries[0].name);
133//!
134//! // Use the same key path to query type information. You don't need a value
135//! // of the type to access its type information.
136//! let user_type = <User as DescribeType>::type_descriptor();
137//! assert!(matches!(
138//!     user_type.type_at(&path).unwrap().as_scalar().unwrap(),
139//!     ScalarType::String,
140//! ));
141//! ```
142//!
143//! ## Using opaque `Value` types
144//!
145//! ```
146//! use mirror_mirror::{Reflect, Value, FromReflect};
147//!
148//! #[derive(Reflect, Clone, Debug)]
149//! struct Foo(Vec<i32>);
150//!
151//! # (|| {
152//! let foo = Foo(vec![1, 2, 3]);
153//!
154//! // Convert `foo` into general "value" type.
155//! let mut value: Value = foo.to_value();
156//!
157//! // `Value` also implements `Reflect` so it can be mutated in the
158//! // same way we've seen before. So these mutations can be made
159//! // by another crate that doesn't know about the `Foo` type.
160//! //
161//! // `Value` is also serializable with `speedy`, for binary serialization,
162//! // or `serde`, for everything else.
163//! value
164//!     .as_tuple_struct_mut()?
165//!     .field_at_mut(0)?
166//!     .as_list_mut()?
167//!     .push(&4);
168//!
169//! // Convert the `value` back into a `Foo`.
170//! let new_foo = Foo::from_reflect(&value)?;
171//!
172//! // Our changes were applied.
173//! assert_eq!(new_foo.0, vec![1, 2, 3, 4]);
174//! # Some(())
175//! # })().unwrap();
176//! ```
177//!
178//! # Inspiration
179//!
180//! The design of this library is heavily inspired by [`bevy_reflect`] but with a few key
181//! differences:
182//!
183//! - [`speedy`] integration which is useful for marshalling data perhaps to send it across FFI.
184//! - A [`Value`] type that can be serialized and deserialized without using trait objects.
185//! - More [type information][type_info] captured.
186//! - Add meta data to types which becomes part of the type information.
187//! - [Key paths][mod@key_path] for querying value and type information.
188//! - No dependencies on [`bevy`] specific crates.
189//! - `#![no_std]` support.
190//!
191//! # Feature flags
192//!
193//! mirror-mirror uses a set of [feature flags] to optionally reduce the number of dependencies.
194//!
195//! The following optional features are available:
196//!
197//! Name | Description | Default?
198//! ---|---|---
199//! `std` | Enables using the standard library (`core` and `alloc` are always required) | Yes
200//! `speedy` | Enables [`speedy`] support for most types | Yes
201//! `serde` | Enables [`serde`] support for most types | Yes
202//! `glam` | Enables impls for [`glam`] | No
203//! `macaw` | Enables impls for [`macaw`] | No
204//!
205//! [`speedy`]: https://crates.io/crates/speedy
206//! [`serde`]: https://crates.io/crates/serde
207//! [`bevy_reflect`]: https://crates.io/crates/bevy_reflect
208//! [`bevy`]: https://crates.io/crates/bevy
209//! [`glam`]: https://crates.io/crates/glam
210//! [`macaw`]: https://crates.io/crates/macaw
211
212#![cfg_attr(not(feature = "std"), no_std)]
213#![warn(
214    clippy::all,
215    clippy::dbg_macro,
216    clippy::todo,
217    clippy::empty_enum,
218    clippy::enum_glob_use,
219    clippy::mem_forget,
220    clippy::unused_self,
221    clippy::filter_map_next,
222    clippy::needless_continue,
223    clippy::needless_borrow,
224    clippy::match_wildcard_for_single_variants,
225    clippy::if_let_mutex,
226    clippy::mismatched_target_os,
227    clippy::await_holding_lock,
228    clippy::match_on_vec_items,
229    clippy::imprecise_flops,
230    clippy::suboptimal_flops,
231    clippy::lossy_float_literal,
232    clippy::rest_pat_in_fully_bound_structs,
233    clippy::fn_params_excessive_bools,
234    clippy::exit,
235    clippy::inefficient_to_string,
236    clippy::linkedlist,
237    clippy::macro_use_imports,
238    clippy::option_option,
239    clippy::verbose_file_reads,
240    clippy::unnested_or_patterns,
241    clippy::str_to_string,
242    rust_2018_idioms,
243    future_incompatible,
244    nonstandard_style,
245    missing_debug_implementations,
246    // missing_docs
247)]
248#![deny(unreachable_pub)]
249#![allow(
250    elided_lifetimes_in_paths,
251    clippy::type_complexity,
252    // because speedy
253    clippy::not_unsafe_ptr_arg_deref,
254)]
255#![forbid(unsafe_code)]
256#![cfg_attr(docsrs, feature(doc_auto_cfg, doc_cfg))]
257#![cfg_attr(test, allow(clippy::float_cmp))]
258
259extern crate alloc;
260
261use alloc::borrow::Cow;
262use alloc::borrow::ToOwned;
263use alloc::boxed::Box;
264use alloc::string::String;
265use core::any::Any;
266use core::any::TypeId;
267use core::fmt;
268
269use crate::enum_::VariantField;
270use crate::enum_::VariantKind;
271
272macro_rules! trivial_reflect_methods {
273    () => {
274        fn type_descriptor(
275            &self,
276        ) -> alloc::borrow::Cow<'static, $crate::type_info::TypeDescriptor> {
277            <Self as $crate::type_info::DescribeType>::type_descriptor()
278        }
279
280        fn as_any(&self) -> &dyn Any {
281            self
282        }
283
284        fn as_any_mut(&mut self) -> &mut dyn Any {
285            self
286        }
287
288        fn as_reflect(&self) -> &dyn Reflect {
289            self
290        }
291
292        fn as_reflect_mut(&mut self) -> &mut dyn Reflect {
293            self
294        }
295    };
296}
297
298/// Reflected array types.
299pub mod array;
300
301/// Reflected enum types.
302pub mod enum_;
303
304/// Helper traits for accessing fields on reflected values.
305pub mod get_field;
306
307/// Iterator types.
308pub mod iter;
309
310/// Key paths for querying value and type information.
311pub mod key_path;
312
313/// Reflected list types.
314pub mod list;
315
316/// Reflected map types.
317pub mod map;
318
319/// Reflected struct types.
320pub mod struct_;
321
322/// Reflected tuple types.
323pub mod tuple;
324
325/// Reflected tuple struct types.
326pub mod tuple_struct;
327
328/// Type information.
329pub mod type_info;
330
331/// Type erased value types.
332pub mod value;
333
334pub mod try_visit;
335
336mod foreign_impls;
337mod reflect_eq;
338
339pub use reflect_eq::reflect_eq;
340
341#[cfg(feature = "std")]
342#[cfg(test)]
343mod tests;
344
345#[doc(inline)]
346pub use mirror_mirror_macros::*;
347
348#[doc(inline)]
349pub use self::array::Array;
350#[doc(inline)]
351pub use self::enum_::Enum;
352#[doc(inline)]
353pub use self::get_field::GetField;
354#[doc(inline)]
355pub use self::get_field::GetFieldMut;
356#[doc(inline)]
357pub use self::list::List;
358#[doc(inline)]
359pub use self::map::Map;
360#[doc(inline)]
361pub use self::struct_::Struct;
362#[doc(inline)]
363pub use self::tuple::Tuple;
364#[doc(inline)]
365pub use self::tuple_struct::TupleStruct;
366#[doc(inline)]
367pub use self::type_info::DescribeType;
368#[doc(inline)]
369pub use self::type_info::TypeDescriptor;
370#[doc(inline)]
371pub use self::value::Value;
372
373pub(crate) static STATIC_RANDOM_STATE: ahash::RandomState = ahash::RandomState::with_seeds(
374    0x86c11a44c63f4f2f,
375    0xaf04d821054d02b3,
376    0x98f0a276c462acc1,
377    0xe2d6368e09c9c079,
378);
379
380/// A reflected type.
381pub trait Reflect: Any + Send + 'static {
382    fn type_descriptor(&self) -> Cow<'static, TypeDescriptor>;
383
384    fn as_any(&self) -> &dyn Any;
385
386    fn as_any_mut(&mut self) -> &mut dyn Any;
387
388    fn as_reflect(&self) -> &dyn Reflect;
389
390    fn as_reflect_mut(&mut self) -> &mut dyn Reflect;
391
392    fn reflect_owned(self: Box<Self>) -> ReflectOwned;
393
394    fn reflect_ref(&self) -> ReflectRef<'_>;
395
396    fn reflect_mut(&mut self) -> ReflectMut<'_>;
397
398    fn patch(&mut self, value: &dyn Reflect);
399
400    fn to_value(&self) -> Value;
401
402    fn clone_reflect(&self) -> Box<dyn Reflect>;
403
404    fn debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
405
406    fn type_id(&self) -> TypeId {
407        TypeId::of::<Self>()
408    }
409
410    fn type_name(&self) -> &str {
411        core::any::type_name::<Self>()
412    }
413
414    fn into_tuple(self: Box<Self>) -> Option<Box<dyn Tuple>> {
415        self.reflect_owned().into_tuple()
416    }
417
418    fn as_tuple(&self) -> Option<&dyn Tuple> {
419        self.reflect_ref().as_tuple()
420    }
421
422    fn as_tuple_mut(&mut self) -> Option<&mut dyn Tuple> {
423        self.reflect_mut().as_tuple_mut()
424    }
425
426    fn into_struct(self: Box<Self>) -> Option<Box<dyn Struct>> {
427        self.reflect_owned().into_struct()
428    }
429
430    fn as_struct(&self) -> Option<&dyn Struct> {
431        self.reflect_ref().as_struct()
432    }
433
434    fn as_struct_mut(&mut self) -> Option<&mut dyn Struct> {
435        self.reflect_mut().as_struct_mut()
436    }
437
438    fn into_tuple_struct(self: Box<Self>) -> Option<Box<dyn TupleStruct>> {
439        self.reflect_owned().into_tuple_struct()
440    }
441
442    fn as_tuple_struct(&self) -> Option<&dyn TupleStruct> {
443        self.reflect_ref().as_tuple_struct()
444    }
445
446    fn as_tuple_struct_mut(&mut self) -> Option<&mut dyn TupleStruct> {
447        self.reflect_mut().as_tuple_struct_mut()
448    }
449
450    fn into_enum(self: Box<Self>) -> Option<Box<dyn Enum>> {
451        self.reflect_owned().into_enum()
452    }
453
454    fn as_enum(&self) -> Option<&dyn Enum> {
455        self.reflect_ref().as_enum()
456    }
457
458    fn as_enum_mut(&mut self) -> Option<&mut dyn Enum> {
459        self.reflect_mut().as_enum_mut()
460    }
461
462    fn into_list(self: Box<Self>) -> Option<Box<dyn List>> {
463        self.reflect_owned().into_list()
464    }
465
466    fn as_list(&self) -> Option<&dyn List> {
467        self.reflect_ref().as_list()
468    }
469
470    fn as_list_mut(&mut self) -> Option<&mut dyn List> {
471        self.reflect_mut().as_list_mut()
472    }
473
474    fn into_array(self: Box<Self>) -> Option<Box<dyn Array>> {
475        self.reflect_owned().into_array()
476    }
477
478    fn as_array(&self) -> Option<&dyn Array> {
479        self.reflect_ref().as_array()
480    }
481
482    fn as_array_mut(&mut self) -> Option<&mut dyn Array> {
483        self.reflect_mut().as_array_mut()
484    }
485
486    fn into_map(self: Box<Self>) -> Option<Box<dyn Map>> {
487        self.reflect_owned().into_map()
488    }
489
490    fn as_map(&self) -> Option<&dyn Map> {
491        self.reflect_ref().as_map()
492    }
493
494    fn as_map_mut(&mut self) -> Option<&mut dyn Map> {
495        self.reflect_mut().as_map_mut()
496    }
497
498    fn into_scalar(self: Box<Self>) -> Option<ScalarOwned> {
499        self.reflect_owned().into_scalar()
500    }
501
502    fn as_scalar(&self) -> Option<ScalarRef<'_>> {
503        self.reflect_ref().as_scalar()
504    }
505
506    fn as_scalar_mut(&mut self) -> Option<ScalarMut<'_>> {
507        self.reflect_mut().as_scalar_mut()
508    }
509}
510
511impl dyn Reflect {
512    pub fn downcast_ref<T>(&self) -> Option<&T>
513    where
514        T: Reflect,
515    {
516        self.as_any().downcast_ref::<T>()
517    }
518
519    pub fn downcast_mut<T>(&mut self) -> Option<&mut T>
520    where
521        T: Reflect,
522    {
523        self.as_any_mut().downcast_mut::<T>()
524    }
525}
526
527impl ToOwned for dyn Reflect {
528    type Owned = Box<dyn Reflect>;
529
530    fn to_owned(&self) -> Self::Owned {
531        self.clone_reflect()
532    }
533}
534
535impl fmt::Debug for dyn Reflect {
536    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
537        self.debug(f)
538    }
539}
540
541impl PartialEq for dyn Reflect {
542    fn eq(&self, other: &Self) -> bool {
543        reflect_eq(self, other).unwrap_or(false)
544    }
545}
546
547macro_rules! impl_for_core_types {
548    ($($ty:ident)*) => {
549        $(
550            impl Reflect for $ty {
551                trivial_reflect_methods!();
552
553                fn patch(&mut self, value: &dyn Reflect) {
554                    if let Some(value) = value.as_any().downcast_ref::<Self>() {
555                        *self = value.clone();
556                    }
557                }
558
559                fn clone_reflect(&self) -> Box<dyn Reflect> {
560                    Box::new(self.clone())
561                }
562
563                fn to_value(&self) -> Value {
564                    Value::from(self.to_owned())
565                }
566
567                fn reflect_owned(self: Box<Self>) -> ReflectOwned {
568                    ReflectOwned::Scalar(ScalarOwned::from(*self))
569                }
570
571                fn reflect_ref(&self) -> ReflectRef<'_> {
572                    ReflectRef::Scalar(ScalarRef::from(*self))
573                }
574
575                fn reflect_mut(&mut self) -> ReflectMut<'_> {
576                    ReflectMut::Scalar(ScalarMut::from(self))
577                }
578
579                fn debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
580                    if f.alternate() {
581                        write!(f, "{:#?}", self)
582                    } else {
583                        write!(f, "{:?}", self)
584                    }
585                }
586            }
587
588            impl FromReflect for $ty {
589                fn from_reflect(reflect: &dyn Reflect) -> Option<Self> {
590                    Some(reflect.downcast_ref::<$ty>()?.clone())
591                }
592            }
593
594            impl From<$ty> for ScalarOwned {
595                fn from(value: $ty) -> Self {
596                    ScalarOwned::$ty(value)
597                }
598            }
599
600            impl From<$ty> for ScalarRef<'static> {
601                fn from(value: $ty) -> Self {
602                    ScalarRef::$ty(value)
603                }
604            }
605
606            impl<'a> From<&'a mut $ty> for ScalarMut<'a> {
607                fn from(value: &'a mut $ty) -> Self {
608                    ScalarMut::$ty(value)
609                }
610            }
611        )*
612    };
613}
614
615impl_for_core_types! {
616    usize u8 u16 u32 u64 u128
617    i8 i16 i32 i64 i128
618    f32 f64
619    bool char
620}
621
622impl Reflect for String {
623    trivial_reflect_methods!();
624
625    fn patch(&mut self, value: &dyn Reflect) {
626        if let Some(value) = value.as_any().downcast_ref::<Self>() {
627            *self = value.clone();
628        }
629    }
630
631    fn clone_reflect(&self) -> Box<dyn Reflect> {
632        Box::new(self.clone())
633    }
634
635    fn to_value(&self) -> Value {
636        Value::from(self.to_owned())
637    }
638
639    fn reflect_owned(self: Box<Self>) -> ReflectOwned {
640        ReflectOwned::Scalar(ScalarOwned::from(*self))
641    }
642
643    fn reflect_ref(&self) -> ReflectRef<'_> {
644        ReflectRef::Scalar(ScalarRef::from(self))
645    }
646
647    fn reflect_mut(&mut self) -> ReflectMut<'_> {
648        ReflectMut::Scalar(ScalarMut::String(self))
649    }
650
651    fn debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
652        if f.alternate() {
653            write!(f, "{self:#?}")
654        } else {
655            write!(f, "{self:?}")
656        }
657    }
658}
659
660impl FromReflect for String {
661    fn from_reflect(reflect: &dyn Reflect) -> Option<Self> {
662        Some(reflect.downcast_ref::<String>()?.clone())
663    }
664}
665
666impl From<String> for ScalarOwned {
667    fn from(value: String) -> Self {
668        ScalarOwned::String(value)
669    }
670}
671
672impl<'a> From<&'a String> for ScalarRef<'a> {
673    fn from(value: &'a String) -> Self {
674        ScalarRef::String(value)
675    }
676}
677
678impl<'a> From<&'a mut String> for ScalarMut<'a> {
679    fn from(value: &'a mut String) -> Self {
680        ScalarMut::String(value)
681    }
682}
683
684/// A trait for types which can be constructed from a reflected type.
685///
686/// Will be implemented by `#[derive(Reflect)]`.
687pub trait FromReflect: Reflect + Sized {
688    fn from_reflect(reflect: &dyn Reflect) -> Option<Self>;
689}
690
691/// An owned reflected value.
692///
693/// Constructed with [`Reflect::reflect_owned`].
694#[derive(Debug)]
695pub enum ReflectOwned {
696    Struct(Box<dyn Struct>),
697    TupleStruct(Box<dyn TupleStruct>),
698    Tuple(Box<dyn Tuple>),
699    Enum(Box<dyn Enum>),
700    Array(Box<dyn Array>),
701    List(Box<dyn List>),
702    Map(Box<dyn Map>),
703    Scalar(ScalarOwned),
704    /// Not all `Reflect` implementations allow access to the underlying value. This variant can be
705    /// used for such types.
706    Opaque(Box<dyn Reflect>),
707}
708
709impl ReflectOwned {
710    pub fn as_reflect_mut(&mut self) -> &mut dyn Reflect {
711        match self {
712            ReflectOwned::Struct(inner) => inner.as_reflect_mut(),
713            ReflectOwned::TupleStruct(inner) => inner.as_reflect_mut(),
714            ReflectOwned::Tuple(inner) => inner.as_reflect_mut(),
715            ReflectOwned::Enum(inner) => inner.as_reflect_mut(),
716            ReflectOwned::Array(inner) => inner.as_reflect_mut(),
717            ReflectOwned::List(inner) => inner.as_reflect_mut(),
718            ReflectOwned::Map(inner) => inner.as_reflect_mut(),
719            ReflectOwned::Scalar(inner) => inner.as_reflect_mut(),
720            ReflectOwned::Opaque(inner) => inner.as_reflect_mut(),
721        }
722    }
723
724    pub fn as_reflect(&self) -> &dyn Reflect {
725        match self {
726            ReflectOwned::Struct(inner) => inner.as_reflect(),
727            ReflectOwned::TupleStruct(inner) => inner.as_reflect(),
728            ReflectOwned::Tuple(inner) => inner.as_reflect(),
729            ReflectOwned::Enum(inner) => inner.as_reflect(),
730            ReflectOwned::Array(inner) => inner.as_reflect(),
731            ReflectOwned::List(inner) => inner.as_reflect(),
732            ReflectOwned::Map(inner) => inner.as_reflect(),
733            ReflectOwned::Scalar(inner) => inner.as_reflect(),
734            ReflectOwned::Opaque(inner) => inner.as_reflect(),
735        }
736    }
737
738    pub fn into_tuple(self) -> Option<Box<dyn Tuple>> {
739        match self {
740            Self::Tuple(inner) => Some(inner),
741            _ => None,
742        }
743    }
744
745    pub fn into_struct(self) -> Option<Box<dyn Struct>> {
746        match self {
747            Self::Struct(inner) => Some(inner),
748            _ => None,
749        }
750    }
751
752    pub fn into_tuple_struct(self) -> Option<Box<dyn TupleStruct>> {
753        match self {
754            Self::TupleStruct(inner) => Some(inner),
755            _ => None,
756        }
757    }
758
759    pub fn into_enum(self) -> Option<Box<dyn Enum>> {
760        match self {
761            Self::Enum(inner) => Some(inner),
762            _ => None,
763        }
764    }
765
766    pub fn into_list(self) -> Option<Box<dyn List>> {
767        match self {
768            Self::List(inner) => Some(inner),
769            _ => None,
770        }
771    }
772
773    pub fn into_array(self) -> Option<Box<dyn Array>> {
774        match self {
775            Self::Array(inner) => Some(inner),
776            _ => None,
777        }
778    }
779
780    pub fn into_map(self) -> Option<Box<dyn Map>> {
781        match self {
782            Self::Map(inner) => Some(inner),
783            _ => None,
784        }
785    }
786
787    pub fn into_scalar(self) -> Option<ScalarOwned> {
788        match self {
789            Self::Scalar(inner) => Some(inner),
790            _ => None,
791        }
792    }
793
794    pub fn into_opaque(self) -> Option<Box<dyn Reflect>> {
795        match self {
796            Self::Opaque(inner) => Some(inner),
797            _ => None,
798        }
799    }
800}
801
802impl Clone for ReflectOwned {
803    fn clone(&self) -> Self {
804        match self {
805            Self::Struct(inner) => inner.clone_reflect().reflect_owned(),
806            Self::TupleStruct(inner) => inner.clone_reflect().reflect_owned(),
807            Self::Tuple(inner) => inner.clone_reflect().reflect_owned(),
808            Self::Enum(inner) => inner.clone_reflect().reflect_owned(),
809            Self::Array(inner) => inner.clone_reflect().reflect_owned(),
810            Self::List(inner) => inner.clone_reflect().reflect_owned(),
811            Self::Map(inner) => inner.clone_reflect().reflect_owned(),
812            Self::Opaque(inner) => inner.clone_reflect().reflect_owned(),
813            Self::Scalar(inner) => Self::Scalar(inner.clone()),
814        }
815    }
816}
817
818/// An owned reflected scalar type.
819#[derive(Debug, Clone)]
820#[allow(non_camel_case_types)]
821#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
822#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
823pub enum ScalarOwned {
824    usize(usize),
825    u8(u8),
826    u16(u16),
827    u32(u32),
828    u64(u64),
829    u128(u128),
830    i8(i8),
831    i16(i16),
832    i32(i32),
833    i64(i64),
834    i128(i128),
835    bool(bool),
836    char(char),
837    f32(f32),
838    f64(f64),
839    String(String),
840}
841
842impl ScalarOwned {
843    pub fn as_reflect_mut(&mut self) -> &mut dyn Reflect {
844        match self {
845            ScalarOwned::usize(inner) => inner,
846            ScalarOwned::u8(inner) => inner,
847            ScalarOwned::u16(inner) => inner,
848            ScalarOwned::u32(inner) => inner,
849            ScalarOwned::u64(inner) => inner,
850            ScalarOwned::u128(inner) => inner,
851            ScalarOwned::i8(inner) => inner,
852            ScalarOwned::i16(inner) => inner,
853            ScalarOwned::i32(inner) => inner,
854            ScalarOwned::i64(inner) => inner,
855            ScalarOwned::i128(inner) => inner,
856            ScalarOwned::bool(inner) => inner,
857            ScalarOwned::char(inner) => inner,
858            ScalarOwned::f32(inner) => inner,
859            ScalarOwned::f64(inner) => inner,
860            ScalarOwned::String(inner) => inner,
861        }
862    }
863
864    pub fn as_reflect(&self) -> &dyn Reflect {
865        match self {
866            ScalarOwned::usize(inner) => inner,
867            ScalarOwned::u8(inner) => inner,
868            ScalarOwned::u16(inner) => inner,
869            ScalarOwned::u32(inner) => inner,
870            ScalarOwned::u64(inner) => inner,
871            ScalarOwned::u128(inner) => inner,
872            ScalarOwned::i8(inner) => inner,
873            ScalarOwned::i16(inner) => inner,
874            ScalarOwned::i32(inner) => inner,
875            ScalarOwned::i64(inner) => inner,
876            ScalarOwned::i128(inner) => inner,
877            ScalarOwned::bool(inner) => inner,
878            ScalarOwned::char(inner) => inner,
879            ScalarOwned::f32(inner) => inner,
880            ScalarOwned::f64(inner) => inner,
881            ScalarOwned::String(inner) => inner,
882        }
883    }
884}
885
886/// An immutable reflected value.
887///
888/// Constructed with [`Reflect::reflect_ref`].
889#[derive(Debug, Copy, Clone)]
890pub enum ReflectRef<'a> {
891    Struct(&'a dyn Struct),
892    TupleStruct(&'a dyn TupleStruct),
893    Tuple(&'a dyn Tuple),
894    Enum(&'a dyn Enum),
895    Array(&'a dyn Array),
896    List(&'a dyn List),
897    Map(&'a dyn Map),
898    Scalar(ScalarRef<'a>),
899    /// Not all `Reflect` implementations allow access to the underlying value. This variant can be
900    /// used for such types.
901    Opaque(&'a dyn Reflect),
902}
903
904impl<'a> ReflectRef<'a> {
905    pub fn as_reflect(&self) -> &dyn Reflect {
906        match self {
907            ReflectRef::Struct(inner) => inner.as_reflect(),
908            ReflectRef::TupleStruct(inner) => inner.as_reflect(),
909            ReflectRef::Tuple(inner) => inner.as_reflect(),
910            ReflectRef::Enum(inner) => inner.as_reflect(),
911            ReflectRef::Array(inner) => inner.as_reflect(),
912            ReflectRef::List(inner) => inner.as_reflect(),
913            ReflectRef::Map(inner) => inner.as_reflect(),
914            ReflectRef::Scalar(inner) => inner.as_reflect(),
915            ReflectRef::Opaque(inner) => inner.as_reflect(),
916        }
917    }
918
919    pub fn as_tuple(self) -> Option<&'a dyn Tuple> {
920        match self {
921            Self::Tuple(inner) => Some(inner),
922            _ => None,
923        }
924    }
925
926    pub fn as_struct(self) -> Option<&'a dyn Struct> {
927        match self {
928            Self::Struct(inner) => Some(inner),
929            _ => None,
930        }
931    }
932
933    pub fn as_tuple_struct(self) -> Option<&'a dyn TupleStruct> {
934        match self {
935            Self::TupleStruct(inner) => Some(inner),
936            _ => None,
937        }
938    }
939
940    pub fn as_enum(self) -> Option<&'a dyn Enum> {
941        match self {
942            Self::Enum(inner) => Some(inner),
943            _ => None,
944        }
945    }
946
947    pub fn as_list(self) -> Option<&'a dyn List> {
948        match self {
949            Self::List(inner) => Some(inner),
950            _ => None,
951        }
952    }
953
954    pub fn as_array(self) -> Option<&'a dyn Array> {
955        match self {
956            Self::Array(inner) => Some(inner),
957            _ => None,
958        }
959    }
960
961    pub fn as_map(self) -> Option<&'a dyn Map> {
962        match self {
963            Self::Map(inner) => Some(inner),
964            _ => None,
965        }
966    }
967
968    pub fn as_scalar(self) -> Option<ScalarRef<'a>> {
969        match self {
970            Self::Scalar(inner) => Some(inner),
971            _ => None,
972        }
973    }
974
975    pub fn as_opaque(self) -> Option<&'a dyn Reflect> {
976        match self {
977            Self::Opaque(inner) => Some(inner),
978            _ => None,
979        }
980    }
981}
982
983/// An immutable reflected scalar value.
984#[derive(Debug, Copy, Clone, PartialEq)]
985#[allow(non_camel_case_types)]
986pub enum ScalarRef<'a> {
987    usize(usize),
988    u8(u8),
989    u16(u16),
990    u32(u32),
991    u64(u64),
992    u128(u128),
993    i8(i8),
994    i16(i16),
995    i32(i32),
996    i64(i64),
997    i128(i128),
998    bool(bool),
999    char(char),
1000    f32(f32),
1001    f64(f64),
1002    String(&'a String),
1003}
1004
1005impl<'a> ScalarRef<'a> {
1006    pub fn as_reflect(&self) -> &dyn Reflect {
1007        match self {
1008            ScalarRef::usize(inner) => inner,
1009            ScalarRef::u8(inner) => inner,
1010            ScalarRef::u16(inner) => inner,
1011            ScalarRef::u32(inner) => inner,
1012            ScalarRef::u64(inner) => inner,
1013            ScalarRef::u128(inner) => inner,
1014            ScalarRef::i8(inner) => inner,
1015            ScalarRef::i16(inner) => inner,
1016            ScalarRef::i32(inner) => inner,
1017            ScalarRef::i64(inner) => inner,
1018            ScalarRef::i128(inner) => inner,
1019            ScalarRef::bool(inner) => inner,
1020            ScalarRef::char(inner) => inner,
1021            ScalarRef::f32(inner) => inner,
1022            ScalarRef::f64(inner) => inner,
1023            ScalarRef::String(inner) => *inner,
1024        }
1025    }
1026}
1027
1028/// A mutable reflected value.
1029///
1030/// Constructed with [`Reflect::reflect_mut`].
1031#[derive(Debug)]
1032pub enum ReflectMut<'a> {
1033    Struct(&'a mut dyn Struct),
1034    TupleStruct(&'a mut dyn TupleStruct),
1035    Tuple(&'a mut dyn Tuple),
1036    Enum(&'a mut dyn Enum),
1037    Array(&'a mut dyn Array),
1038    List(&'a mut dyn List),
1039    Map(&'a mut dyn Map),
1040    Scalar(ScalarMut<'a>),
1041    /// Not all `Reflect` implementations allow mutable access to the underlying value (such as
1042    /// [`core::num::NonZeroU8`]). This variant can be used for such types.
1043    Opaque(&'a mut dyn Reflect),
1044}
1045
1046impl<'a> ReflectMut<'a> {
1047    pub fn as_reflect_mut(&mut self) -> &mut dyn Reflect {
1048        match self {
1049            ReflectMut::Struct(inner) => inner.as_reflect_mut(),
1050            ReflectMut::TupleStruct(inner) => inner.as_reflect_mut(),
1051            ReflectMut::Tuple(inner) => inner.as_reflect_mut(),
1052            ReflectMut::Enum(inner) => inner.as_reflect_mut(),
1053            ReflectMut::Array(inner) => inner.as_reflect_mut(),
1054            ReflectMut::List(inner) => inner.as_reflect_mut(),
1055            ReflectMut::Map(inner) => inner.as_reflect_mut(),
1056            ReflectMut::Scalar(inner) => inner.as_reflect_mut(),
1057            ReflectMut::Opaque(inner) => inner.as_reflect_mut(),
1058        }
1059    }
1060
1061    pub fn as_reflect(&self) -> &dyn Reflect {
1062        match self {
1063            ReflectMut::Struct(inner) => inner.as_reflect(),
1064            ReflectMut::TupleStruct(inner) => inner.as_reflect(),
1065            ReflectMut::Tuple(inner) => inner.as_reflect(),
1066            ReflectMut::Enum(inner) => inner.as_reflect(),
1067            ReflectMut::Array(inner) => inner.as_reflect(),
1068            ReflectMut::List(inner) => inner.as_reflect(),
1069            ReflectMut::Map(inner) => inner.as_reflect(),
1070            ReflectMut::Scalar(inner) => inner.as_reflect(),
1071            ReflectMut::Opaque(inner) => inner.as_reflect(),
1072        }
1073    }
1074
1075    pub fn as_tuple_mut(self) -> Option<&'a mut dyn Tuple> {
1076        match self {
1077            Self::Tuple(inner) => Some(inner),
1078            _ => None,
1079        }
1080    }
1081
1082    pub fn as_struct_mut(self) -> Option<&'a mut dyn Struct> {
1083        match self {
1084            Self::Struct(inner) => Some(inner),
1085            _ => None,
1086        }
1087    }
1088
1089    pub fn as_tuple_struct_mut(self) -> Option<&'a mut dyn TupleStruct> {
1090        match self {
1091            Self::TupleStruct(inner) => Some(inner),
1092            _ => None,
1093        }
1094    }
1095
1096    pub fn as_enum_mut(self) -> Option<&'a mut dyn Enum> {
1097        match self {
1098            Self::Enum(inner) => Some(inner),
1099            _ => None,
1100        }
1101    }
1102
1103    pub fn as_list_mut(self) -> Option<&'a mut dyn List> {
1104        match self {
1105            Self::List(inner) => Some(inner),
1106            _ => None,
1107        }
1108    }
1109
1110    pub fn as_array_mut(self) -> Option<&'a mut dyn Array> {
1111        match self {
1112            Self::Array(inner) => Some(inner),
1113            _ => None,
1114        }
1115    }
1116
1117    pub fn as_map_mut(self) -> Option<&'a mut dyn Map> {
1118        match self {
1119            Self::Map(inner) => Some(inner),
1120            _ => None,
1121        }
1122    }
1123
1124    pub fn as_scalar_mut(self) -> Option<ScalarMut<'a>> {
1125        match self {
1126            Self::Scalar(inner) => Some(inner),
1127            _ => None,
1128        }
1129    }
1130
1131    pub fn as_opaque_mut(self) -> Option<&'a mut dyn Reflect> {
1132        match self {
1133            Self::Opaque(inner) => Some(inner),
1134            _ => None,
1135        }
1136    }
1137}
1138
1139/// An mutable reflected scalar value.
1140#[derive(Debug)]
1141#[allow(non_camel_case_types)]
1142pub enum ScalarMut<'a> {
1143    usize(&'a mut usize),
1144    u8(&'a mut u8),
1145    u16(&'a mut u16),
1146    u32(&'a mut u32),
1147    u64(&'a mut u64),
1148    u128(&'a mut u128),
1149    i8(&'a mut i8),
1150    i16(&'a mut i16),
1151    i32(&'a mut i32),
1152    i64(&'a mut i64),
1153    i128(&'a mut i128),
1154    bool(&'a mut bool),
1155    char(&'a mut char),
1156    f32(&'a mut f32),
1157    f64(&'a mut f64),
1158    String(&'a mut String),
1159}
1160
1161impl<'a> ScalarMut<'a> {
1162    pub fn as_reflect_mut(&mut self) -> &mut dyn Reflect {
1163        match self {
1164            ScalarMut::usize(inner) => *inner,
1165            ScalarMut::u8(inner) => *inner,
1166            ScalarMut::u16(inner) => *inner,
1167            ScalarMut::u32(inner) => *inner,
1168            ScalarMut::u64(inner) => *inner,
1169            ScalarMut::u128(inner) => *inner,
1170            ScalarMut::i8(inner) => *inner,
1171            ScalarMut::i16(inner) => *inner,
1172            ScalarMut::i32(inner) => *inner,
1173            ScalarMut::i64(inner) => *inner,
1174            ScalarMut::i128(inner) => *inner,
1175            ScalarMut::bool(inner) => *inner,
1176            ScalarMut::char(inner) => *inner,
1177            ScalarMut::f32(inner) => *inner,
1178            ScalarMut::f64(inner) => *inner,
1179            ScalarMut::String(inner) => *inner,
1180        }
1181    }
1182
1183    pub fn as_reflect(&self) -> &dyn Reflect {
1184        match self {
1185            ScalarMut::usize(inner) => *inner,
1186            ScalarMut::u8(inner) => *inner,
1187            ScalarMut::u16(inner) => *inner,
1188            ScalarMut::u32(inner) => *inner,
1189            ScalarMut::u64(inner) => *inner,
1190            ScalarMut::u128(inner) => *inner,
1191            ScalarMut::i8(inner) => *inner,
1192            ScalarMut::i16(inner) => *inner,
1193            ScalarMut::i32(inner) => *inner,
1194            ScalarMut::i64(inner) => *inner,
1195            ScalarMut::i128(inner) => *inner,
1196            ScalarMut::bool(inner) => *inner,
1197            ScalarMut::char(inner) => *inner,
1198            ScalarMut::f32(inner) => *inner,
1199            ScalarMut::f64(inner) => *inner,
1200            ScalarMut::String(inner) => *inner,
1201        }
1202    }
1203}
1204
1205/// Debug formatter for any reflection value.
1206pub fn reflect_debug(value: &dyn Reflect, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1207    fn scalar_debug(
1208        scalar: &dyn core::fmt::Debug,
1209        f: &mut core::fmt::Formatter<'_>,
1210    ) -> fmt::Result {
1211        if f.alternate() {
1212            write!(f, "{scalar:#?}")
1213        } else {
1214            write!(f, "{scalar:?}")
1215        }
1216    }
1217
1218    match value.reflect_ref() {
1219        ReflectRef::Struct(inner) => {
1220            let mut f = f.debug_struct(inner.type_name());
1221            for (name, value) in inner.fields() {
1222                f.field(name, &value as &dyn ::core::fmt::Debug);
1223            }
1224            f.finish()
1225        }
1226        ReflectRef::TupleStruct(inner) => {
1227            let mut f = f.debug_tuple(inner.type_name());
1228            for field in inner.fields() {
1229                f.field(&field as &dyn ::core::fmt::Debug);
1230            }
1231            f.finish()
1232        }
1233        ReflectRef::Tuple(inner) => {
1234            let mut f = f.debug_tuple("");
1235            for field in inner.fields() {
1236                f.field(&field as &dyn ::core::fmt::Debug);
1237            }
1238            f.finish()
1239        }
1240        ReflectRef::Enum(inner) => match inner.variant_kind() {
1241            VariantKind::Struct => {
1242                let mut f = f.debug_struct(inner.variant_name());
1243                for field in inner.fields() {
1244                    match field {
1245                        VariantField::Struct(name, value) => {
1246                            f.field(name, &value as &dyn ::core::fmt::Debug);
1247                        }
1248                        VariantField::Tuple { .. } => {
1249                            unreachable!("unit variant yielded struct field")
1250                        }
1251                    }
1252                }
1253                f.finish()
1254            }
1255            VariantKind::Tuple => {
1256                let mut f = f.debug_tuple(inner.variant_name());
1257                for field in inner.fields() {
1258                    match field {
1259                        VariantField::Struct { .. } => {
1260                            unreachable!("unit variant yielded struct field")
1261                        }
1262                        VariantField::Tuple(value) => {
1263                            f.field(&value as &dyn ::core::fmt::Debug);
1264                        }
1265                    }
1266                }
1267                f.finish()
1268            }
1269            VariantKind::Unit => write!(f, "{}", inner.variant_name()),
1270        },
1271        ReflectRef::Array(inner) => f.debug_list().entries(inner.iter()).finish(),
1272        ReflectRef::List(inner) => f.debug_list().entries(inner.iter()).finish(),
1273        ReflectRef::Map(inner) => f.debug_map().entries(inner.iter()).finish(),
1274        ReflectRef::Scalar(inner) => match inner {
1275            ScalarRef::usize(inner) => scalar_debug(&inner, f),
1276            ScalarRef::u8(inner) => scalar_debug(&inner, f),
1277            ScalarRef::u16(inner) => scalar_debug(&inner, f),
1278            ScalarRef::u32(inner) => scalar_debug(&inner, f),
1279            ScalarRef::u64(inner) => scalar_debug(&inner, f),
1280            ScalarRef::u128(inner) => scalar_debug(&inner, f),
1281            ScalarRef::i8(inner) => scalar_debug(&inner, f),
1282            ScalarRef::i16(inner) => scalar_debug(&inner, f),
1283            ScalarRef::i32(inner) => scalar_debug(&inner, f),
1284            ScalarRef::i64(inner) => scalar_debug(&inner, f),
1285            ScalarRef::i128(inner) => scalar_debug(&inner, f),
1286            ScalarRef::bool(inner) => scalar_debug(&inner, f),
1287            ScalarRef::char(inner) => scalar_debug(&inner, f),
1288            ScalarRef::f32(inner) => scalar_debug(&inner, f),
1289            ScalarRef::f64(inner) => scalar_debug(&inner, f),
1290            ScalarRef::String(inner) => scalar_debug(&inner, f),
1291        },
1292        ReflectRef::Opaque(_) => {
1293            write!(f, "{}", value.type_name())
1294        }
1295    }
1296}
1297
1298/// Private. Used by macros
1299#[doc(hidden)]
1300pub mod __private {
1301    pub use alloc::borrow::Cow;
1302    pub use alloc::collections::BTreeMap;
1303    pub use core::any::Any;
1304    pub use core::any::TypeId;
1305    pub use core::fmt;
1306
1307    pub use once_cell::race::OnceBox;
1308
1309    pub use self::enum_::*;
1310    pub use self::key_path::{
1311        field, get, variant, Breadcrumbs, GetPath, GetTypePath, IntoKeyOrIndex, Key, KeyPath,
1312        NamedOrNumbered,
1313    };
1314    pub use self::struct_::{Struct, StructValue};
1315    pub use self::tuple::{Tuple, TupleValue};
1316    pub use self::tuple_struct::{TupleStruct, TupleStructValue};
1317    pub use self::value::*;
1318    pub use crate::iter::*;
1319    pub use crate::type_info::graph::*;
1320    pub use crate::*;
1321
1322    pub trait IntoValue {
1323        fn into_value(self) -> Value;
1324    }
1325
1326    impl<R> IntoValue for R
1327    where
1328        R: Reflect,
1329    {
1330        fn into_value(self) -> Value {
1331            self.to_value()
1332        }
1333    }
1334
1335    impl IntoValue for &str {
1336        fn into_value(self) -> Value {
1337            self.to_owned().into_value()
1338        }
1339    }
1340}