extern crate downcast;
use downcast::{downcast_sync, AnySync};
use std::sync::Arc;
trait Service: AnySync {
fn what_am_i(&self);
}
downcast_sync!(dyn Service);
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();
}