1
- use std:: any:: { Any , TypeId } ;
1
+ use std:: any:: { type_name , Any , TypeId } ;
2
2
use std:: collections:: HashMap ;
3
3
use std:: fmt;
4
4
use std:: hash:: { BuildHasherDefault , Hasher } ;
@@ -267,7 +267,21 @@ impl Extensions {
267
267
268
268
impl fmt:: Debug for Extensions {
269
269
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
270
- f. debug_struct ( "Extensions" ) . finish ( )
270
+ struct TypeName ( & ' static str ) ;
271
+ impl fmt:: Debug for TypeName {
272
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
273
+ f. write_str ( self . 0 )
274
+ }
275
+ }
276
+
277
+ let mut set = f. debug_set ( ) ;
278
+ if let Some ( map) = & self . map {
279
+ set. entries (
280
+ map. values ( )
281
+ . map ( |any_clone| TypeName ( any_clone. as_ref ( ) . type_name ( ) ) ) ,
282
+ ) ;
283
+ }
284
+ set. finish ( )
271
285
}
272
286
}
273
287
@@ -276,6 +290,7 @@ trait AnyClone: Any {
276
290
fn as_any ( & self ) -> & dyn Any ;
277
291
fn as_any_mut ( & mut self ) -> & mut dyn Any ;
278
292
fn into_any ( self : Box < Self > ) -> Box < dyn Any > ;
293
+ fn type_name ( & self ) -> & ' static str ;
279
294
}
280
295
281
296
impl < T : Clone + Send + Sync + ' static > AnyClone for T {
@@ -294,6 +309,10 @@ impl<T: Clone + Send + Sync + 'static> AnyClone for T {
294
309
fn into_any ( self : Box < Self > ) -> Box < dyn Any > {
295
310
self
296
311
}
312
+
313
+ fn type_name ( & self ) -> & ' static str {
314
+ type_name :: < T > ( )
315
+ }
297
316
}
298
317
299
318
impl Clone for Box < dyn AnyClone + Send + Sync > {
@@ -308,13 +327,23 @@ fn test_extensions() {
308
327
struct MyType ( i32 ) ;
309
328
310
329
let mut extensions = Extensions :: new ( ) ;
330
+ assert_eq ! ( format!( "{extensions:?}" ) , "{}" ) ;
311
331
312
332
extensions. insert ( 5i32 ) ;
313
333
extensions. insert ( MyType ( 10 ) ) ;
314
334
315
335
assert_eq ! ( extensions. get( ) , Some ( & 5i32 ) ) ;
316
336
assert_eq ! ( extensions. get_mut( ) , Some ( & mut 5i32 ) ) ;
317
337
338
+ let dbg = format ! ( "{extensions:?}" ) ;
339
+ // map order is NOT deterministic
340
+ assert ! (
341
+ ( dbg == "{http::extensions::test_extensions::MyType, i32}" )
342
+ || ( dbg == "{i32, http::extensions::test_extensions::MyType}" ) ,
343
+ "{}" ,
344
+ dbg
345
+ ) ;
346
+
318
347
let ext2 = extensions. clone ( ) ;
319
348
320
349
assert_eq ! ( extensions. remove:: <i32 >( ) , Some ( 5i32 ) ) ;
0 commit comments