[rust][carnelian] carnelian to fuchsia-component

Change-Id: Ife2dd133305b27609ad948b799215d2f318f3ac8
diff --git a/garnet/public/rust/carnelian/BUILD.gn b/garnet/public/rust/carnelian/BUILD.gn
index d7bb14d..79164cf 100644
--- a/garnet/public/rust/carnelian/BUILD.gn
+++ b/garnet/public/rust/carnelian/BUILD.gn
@@ -14,8 +14,8 @@
     "//garnet/examples/fidl/services:echo-rustc",
     "//garnet/public/lib/fidl/rust/fidl",
     "//garnet/public/rust/fdio",
-    "//garnet/public/rust/fuchsia-app",
     "//garnet/public/rust/fuchsia-async",
+    "//garnet/public/rust/fuchsia-component",
     "//garnet/public/rust/fuchsia-scenic",
     "//garnet/public/rust/fuchsia-syslog",
     "//garnet/public/rust/fuchsia-zircon",
@@ -64,8 +64,8 @@
   deps = [
     "//garnet/public/lib/fidl/rust/fidl",
     "//garnet/public/rust/carnelian",
-    "//garnet/public/rust/fuchsia-app",
     "//garnet/public/rust/fuchsia-async",
+    "//garnet/public/rust/fuchsia-component",
     "//garnet/public/rust/fuchsia-scenic",
     "//garnet/public/rust/fuchsia-zircon",
     "//sdk/fidl/fuchsia.math:fuchsia.math-rustc",
diff --git a/garnet/public/rust/carnelian/examples/embedding.rs b/garnet/public/rust/carnelian/examples/embedding.rs
index 9fa5b6f..25a069c 100644
--- a/garnet/public/rust/carnelian/examples/embedding.rs
+++ b/garnet/public/rust/carnelian/examples/embedding.rs
@@ -10,7 +10,7 @@
 use fidl_fuchsia_math::RectF;
 use fidl_fuchsia_ui_app::ViewProviderMarker;
 use fidl_fuchsia_ui_gfx::{BoundingBox, Vec3, ViewProperties};
-use fuchsia_app::client::{App as LaunchedApp, Launcher};
+use fuchsia_component::client::{App as LaunchedApp, launcher, launch};
 use fuchsia_scenic::{
     new_view_token_pair, EntityNode, Rectangle, SessionPtr, ShapeNode, ViewHolder,
 };
@@ -41,7 +41,8 @@
         _: ViewKey,
         session: &SessionPtr,
     ) -> Result<ViewAssistantPtr, Error> {
-        let app = Launcher::new()?.launch(
+        let app = launch(
+            &launcher()?,
             "fuchsia-pkg://fuchsia.com/spinning_square_rs#meta/spinning_square_rs.cmx".to_string(),
             None,
         )?;
diff --git a/garnet/public/rust/carnelian/src/app.rs b/garnet/public/rust/carnelian/src/app.rs
index bf9985f3..e18ed3c 100644
--- a/garnet/public/rust/carnelian/src/app.rs
+++ b/garnet/public/rust/carnelian/src/app.rs
@@ -7,14 +7,15 @@
     view::{ViewAssistantPtr, ViewController, ViewKey},
 };
 use failure::{bail, Error, ResultExt};
-use fidl::endpoints::{create_endpoints, create_proxy, RequestStream, ServiceMarker};
-use fidl_fuchsia_ui_app::{ViewProviderMarker, ViewProviderRequest, ViewProviderRequestStream};
+use fidl::endpoints::{create_endpoints, create_proxy};
+use fidl_fuchsia_ui_app::{ViewProviderRequest, ViewProviderRequestStream};
 use fidl_fuchsia_ui_scenic::{ScenicMarker, ScenicProxy, SessionListenerRequest};
 use fidl_fuchsia_ui_views::ViewToken;
-use fuchsia_app::{self as component, client::connect_to_service, server::FdioServer};
 use fuchsia_async as fasync;
+use fuchsia_component::{self as component, client::connect_to_service};
 use fuchsia_scenic::{Session, SessionPtr};
-use futures::{TryFutureExt, TryStreamExt};
+use fuchsia_zircon as zx;
+use futures::{Future, StreamExt, TryFutureExt, TryStreamExt};
 use std::{
     cell::RefCell,
     collections::BTreeMap,
@@ -106,7 +107,7 @@
             fut
         })?;
 
-        executor.run_singlethreaded(fut)?;
+        executor.run_singlethreaded(fut);
 
         Ok(())
     }
@@ -210,9 +211,9 @@
         Ok(())
     }
 
-    fn spawn_view_provider_server(chan: fasync::Channel) {
+    fn spawn_view_provider_server(stream: ViewProviderRequestStream) {
         fasync::spawn_local(
-            ViewProviderRequestStream::from_channel(chan)
+            stream
                 .try_for_each(move |req| {
                     let ViewProviderRequest::CreateView { token, .. } = req;
                     let view_token = ViewToken { value: token };
@@ -226,30 +227,36 @@
         )
     }
 
-    fn pass_connection_to_assistant(channel: fasync::Channel, service_name: &'static str) {
-        App::with(|app| {
-            app.assistant
-                .as_mut()
-                .unwrap()
-                .handle_service_connection_request(service_name, channel)
-                .unwrap_or_else(|e| eprintln!("error running {} server: {:?}", service_name, e));
-        });
+    fn pass_connection_to_assistant(channel: zx::Channel, service_name: &'static str) {
+        match fasync::Channel::from_channel(channel) {
+            Ok(channel) => {
+                App::with(|app| {
+                    app.assistant
+                        .as_mut()
+                        .unwrap()
+                        .handle_service_connection_request(service_name, channel)
+                        .unwrap_or_else(|e| eprintln!("error running {} server: {:?}", service_name, e));
+                });
+            },
+            Err(e) => eprintln!("error asyncifying channel: {:?}", e),
+        }
     }
 
-    fn start_services(app: &mut App) -> Result<FdioServer, Error> {
+    fn start_services(app: &mut App) -> Result<impl Future<Output = ()>, Error> {
         let outgoing_services_names = app.assistant.as_ref().unwrap().outgoing_services_names();
-        let services_server = component::server::ServicesServer::new();
-        let mut services_server =
-            services_server.add_service((ViewProviderMarker::NAME, move |channel| {
-                Self::spawn_view_provider_server(channel);
-            }));
+        let mut fs = component::server::ServiceFs::new();
+        let mut public = fs.dir("public");
+        public.add_fidl_service(Self::spawn_view_provider_server);
 
         for name in outgoing_services_names {
-            services_server = services_server.add_service((name, move |channel| {
+            public.add_service_at(name, move |channel| {
                 Self::pass_connection_to_assistant(channel, name);
-            }));
+                None
+            });
         }
 
-        Ok(services_server.start()?)
+        fs.take_and_serve_directory_handle()?;
+
+        Ok(fs.collect())
     }
 }
diff --git a/garnet/public/rust/carnelian/src/lib.rs b/garnet/public/rust/carnelian/src/lib.rs
index f9f418e..916d05e 100644
--- a/garnet/public/rust/carnelian/src/lib.rs
+++ b/garnet/public/rust/carnelian/src/lib.rs
@@ -10,6 +10,7 @@
 //! [Rust](https://www.rust-lang.org/).
 
 #![deny(missing_docs)]
+#![feature(futures_api)]
 
 mod app;
 mod canvas;