#any #type-id #downcast

better_any

Type id and Any for non static types

4 releases

0.2.0 Oct 12, 2022
0.2.0-dev.1 Aug 12, 2021
0.1.1 Jan 8, 2021
0.1.0 Oct 19, 2020

#317 in Rust patterns

Download history 9633/week @ 2022-08-15 12417/week @ 2022-08-22 5397/week @ 2022-08-29 6226/week @ 2022-09-05 7733/week @ 2022-09-12 5985/week @ 2022-09-19 9389/week @ 2022-09-26 12253/week @ 2022-10-03 12129/week @ 2022-10-10 10995/week @ 2022-10-17 10784/week @ 2022-10-24 10989/week @ 2022-10-31 9879/week @ 2022-11-07 8683/week @ 2022-11-14 8181/week @ 2022-11-21 8180/week @ 2022-11-28

35,940 downloads per month
Used in 131 crates (9 directly)

MIT/Apache

34KB
452 lines

Better_Any

docs Crate

Provides a workaround for absence of non_static_type_id feature in Rust and extended version of Any trait for types with single lifetime.

For more details see documentation.

MSRV: 1.41.0-stable

License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this repository by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

lib.rs:

Better Any

Rust RFC for non_static_type_id feature has been reverted. Which means in foreseeable future there will be no built-in way in rust to get type id for non-static type let alone safely use it to downcast to a particular type.

This crate provides tools to do these things safely for types with single lifetime. Although looks like it is technically possible to extend this approach for multiple lifetimes, consistent api and derive macro would be much harder to create and use because of the necessity to properly handle lifetime relations. Feel free to create an issue if you have actual use case where you need this functionality for multiple lifetimes.

Also it has better downcasting that allows you do downcast not just from dyn Tid (like dyn Any) but from any trait object that implements [Tid]. So there is no more need to extend your traits with fn to_any(&self)-> &dyn Any

MSRV: 1.41.0-stable (without nightly feature)

Usage

Basically in places where before you have used dyn Any you can use dyn Tid<'a>

  • If your type is generic you should derive Tid implementation for it with tid! macro or Tid derive macro. Then to retrieve back concrete type <dyn Tid>::downcast_* methods should be used.
  • If your type is not generic/implements Any you can create dyn Tid from it via any of the available From implementations. Then to retrieve back concrete type <dyn Tid>::downcast_any_* methods should be used
  • If your type is not generic and local to your crate you also can derive Tid but then you need to be careful to use methods that corresponds to the way you create dyn Tid for that particular type. Otherwise downcasting will return None.

If all your types can implement Tid to avoid confusion recommended way is to use first option even if some types implement Any. If there are some types that implement Any and can't implement Tid (i.e. types from other library), recommended way is to use second option for all types that implement Any to reduce confusion to minimum.

Interoperability with Any

Unfortunately you can't just use Tid everywhere because currently it is impossible to implement Tid for T:Any since it would conflict with any other possible Tid implementation. To overcome this limitation there is a From impl to go from Box/&/&mut T where T:Any to Box/&/&mut dyn Tid.

Nevertheless if you are using dyn Trait where Trait:Tid all of this wouldn't work, and you are left with Tid only.

Safety

It is safe because created trait object preserves lifetime information, thus allowing us to safely downcast with proper lifetime. Otherwise internally it is plain old Any.

Dependencies

~92KB