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 {}