chiark / gitweb /
fmt
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Jun 2023 16:36:58 +0000 (17:36 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 5 Jun 2023 16:36:58 +0000 (17:36 +0100)
src/main.rs

index a622907197df391ec52655c3c3b8d2a283efaac2..beb677cd1e7d1bf7cd3e6a7686c63bf1e2b93508 100644 (file)
@@ -1,8 +1,7 @@
-
-use std::any::{Any,TypeId};
+use std::any::{Any, TypeId};
 use std::sync::Arc;
 
-use downcast_rs::{Downcast, DowncastSync, impl_downcast};
+use downcast_rs::{impl_downcast, Downcast, DowncastSync};
 
 pub trait HasPseudoMethods: DowncastSync {
     fn get_caster(&self, tp: TypeId) -> Option<&'static dyn Any>;
@@ -16,7 +15,9 @@ trait HasFeet {
 struct Frog;
 
 impl HasFeet for Frog {
-   fn how_many_feet(&self) -> usize { 4 }
+    fn how_many_feet(&self) -> usize {
+        4
+    }
 }
 
 impl HasPseudoMethods for Frog {
@@ -24,20 +25,17 @@ impl HasPseudoMethods for Frog {
     // need a registry of cast-to-trait objects, similar to the existing dispatch
     // table.  I'm not sure if that's needed.
     fn get_caster(&self, tp: TypeId) -> Option<&'static dyn Any> {
-        if tp == TypeId::of::<
-                &'static dyn HasFeet
-                >() {
-            static CASTER: fn(&dyn HasPseudoMethods) -> &dyn HasFeet
-                = |self_| {
-                    let self_: &dyn Any = Downcast::as_any(self_);
-                    let self_: &Frog = self_.downcast_ref().unwrap();
-                    let self_: &dyn HasFeet = self_ as _;
-                    self_
-                };
-                
-           return Some(&CASTER);
-       }
-       None
+        if tp == TypeId::of::<&'static dyn HasFeet>() {
+            static CASTER: fn(&dyn HasPseudoMethods) -> &dyn HasFeet = |self_| {
+                let self_: &dyn Any = Downcast::as_any(self_);
+                let self_: &Frog = self_.downcast_ref().unwrap();
+                let self_: &dyn HasFeet = self_ as _;
+                self_
+            };
+
+            return Some(&CASTER);
+        }
+        None
     }
 }
 
@@ -46,15 +44,17 @@ fn main() {
     let erased_frog: Arc<dyn HasPseudoMethods> = frog as _;
     let erased_frog: &dyn HasPseudoMethods = &*erased_frog;
 
-    let caster: &'static dyn Any
-        = erased_frog.get_caster(TypeId::of::<&'static dyn HasFeet>()).unwrap();
+    let caster: &'static dyn Any = erased_frog
+        .get_caster(TypeId::of::<&'static dyn HasFeet>())
+        .unwrap();
 
-    let caster: &'static fn(&dyn HasPseudoMethods) -> &dyn HasFeet
-        = caster.downcast_ref().unwrap();
+    let caster: &'static fn(&dyn HasPseudoMethods) -> &dyn HasFeet = caster.downcast_ref().unwrap();
 
     let with_feet: &dyn HasFeet = caster(erased_frog);
-        
-    println!("A frog has {} feet and eats .",
-             with_feet.how_many_feet(),/*
-             eats_food.favorite_food()*/)
+
+    println!(
+        "A frog has {} feet and eats .",
+        with_feet.how_many_feet(), /*
+                                   eats_food.favorite_food()*/
+    )
 }