1use std::{
2 any::{Any, type_name},
3 fmt::Debug,
4 hash::Hash,
5};
6
7use turbo_dyn_eq_hash::{
8 DynEq, DynHash, impl_eq_for_dyn, impl_hash_for_dyn, impl_partial_eq_for_dyn,
9};
10
11use crate::trace::TraceRawVcs;
12
13pub trait MagicAny: Debug + DynEq + DynHash + TraceRawVcs + Send + Sync + 'static {
14 #[cfg(debug_assertions)]
15 fn magic_type_name(&self) -> &'static str;
16}
17
18impl<T> MagicAny for T
19where
20 T: Debug + Eq + Hash + Send + Sync + TraceRawVcs + 'static,
21{
22 #[cfg(debug_assertions)]
23 fn magic_type_name(&self) -> &'static str {
24 std::any::type_name::<T>()
25 }
26}
27
28impl_partial_eq_for_dyn!(dyn MagicAny);
29impl_eq_for_dyn!(dyn MagicAny);
30impl_hash_for_dyn!(dyn MagicAny);
31
32pub fn any_as_encode<T: Any>(this: &dyn Any) -> &T {
33 if let Some(enc) = this.downcast_ref::<T>() {
34 return enc;
35 }
36 unreachable!(
37 "any_as_encode::<{}> called with invalid type",
38 type_name::<T>()
39 );
40}