| extern crate downcast; |
| |
| // careful: do not combine downcast_sync! with downcast::Any, you will get `size not known at compile time` errors |
| use downcast::{downcast_sync, AnySync}; |
| use std::sync::Arc; |
| |
| /* Trait */ |
| |
| trait Service: AnySync { |
| fn what_am_i(&self); |
| } |
| |
| downcast_sync!(dyn Service); |
| |
| /* Impl */ |
| |
| struct Database {} |
| |
| impl Service for Database { |
| fn what_am_i(&self){ |
| println!("I'm a database!"); |
| } |
| } |
| |
| impl Database { |
| fn purge_data(&self) { |
| println!("Database has been purged! Goodbye, data!") |
| } |
| } |
| |
| fn main(){ |
| let service: Arc<dyn Service> = Arc::new(Database{}); |
| service.what_am_i(); |
| { |
| let db = service.downcast_ref::<Database>().unwrap(); |
| db.purge_data(); |
| } |
| let db: Arc<Database> = service.downcast_arc::<Database>().ok().unwrap(); |
| db.purge_data(); |
| } |
| |