multi_any/lib.rs
1//! Provides [`MultiAny`], a trait for dynamic typing that allows downcasting to
2//! concrete types and trait objects.
3//!
4//! [Cargo features](`features`).
5
6#![cfg_attr(feature = "nightly", feature(ptr_metadata))]
7
8mod meta;
9mod multi_any;
10mod ptr_metadata;
11mod typed_metadata;
12
13pub use meta::*;
14pub use multi_any::*;
15pub use ptr_metadata::multi_any;
16pub use typed_metadata::*;
17
18/// Derive macro for `MultiAny`.
19///
20/// See [`MultiAny`] for usage and examples.
21pub use multi_any_macro::MultiAny;
22
23/// # Cargo features
24///
25/// - `stable` (default): Uses the `ptr_meta` crate for pointer metadata operations.
26/// - `nightly`: Uses nightly Rust's built-in `ptr_metadata` feature.
27///
28/// ## Usage
29///
30/// On stable Rust (default), annotate traits with `#[multi_any]`:
31/// ```
32/// use multi_any::*;
33///
34/// #[multi_any]
35/// trait SomeTrait {}
36///
37/// #[derive(MultiAny)]
38/// #[multi_any(SomeTrait)]
39/// struct Foo;
40/// impl SomeTrait for Foo {}
41///
42/// let foo: Box<dyn MultiAny> = Box::new(Foo);
43/// assert!(foo.downcast_ref::<dyn SomeTrait>().is_some())
44/// ```
45///
46/// On nightly Rust with the "nightly" feature enabled, it is possible to omit `#[multi_any]`
47/// ```
48/// #[cfg(feature="nightly")]
49/// {
50/// use multi_any::*;
51///
52/// // no annotation here
53/// trait SomeTrait {}
54///
55/// #[derive(MultiAny)]
56/// #[multi_any(SomeTrait)]
57/// struct Foo;
58/// impl SomeTrait for Foo {}
59///
60/// let foo: Box<dyn MultiAny> = Box::new(Foo);
61/// assert!(foo.downcast_ref::<dyn SomeTrait>().is_some())
62/// }
63/// ```
64pub mod features {}