Import 'downcast' crate
Request Document: go/android-rust-importing-crates
For CL Reviewers: go/android3p#cl-review
For Build Team: go/ab-third-party-imports
Bug: http://b/310600230
Change-Id: I68fb2495b218f6b930072e2ee052402036c3d56e
IGNORE_COMPLIANCELINT=LicenseIsKnown: I believe the symlink is triggering b/270248598
diff --git a/examples/sync_service.rs b/examples/sync_service.rs
new file mode 100644
index 0000000..36f4426
--- /dev/null
+++ b/examples/sync_service.rs
@@ -0,0 +1,41 @@
+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();
+}
+