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(); | |
} | |