[rust][inspect] Reland "[rust][inspect] Write to Vmofile"

This is a reland of e826c3bae02a1025d3d661804a3694541f71f51a

Original change's description:
> [rust][inspect] Write to Vmofile
>
> TESTED=through example,fx run-test rust-crates-tests -t fuchsia_inspect_lib_test
>
> CF-607 #comment
>
> Change-Id: If227e2bd26d5813595a65d0706eff273f54a0d0a

Change-Id: I2fc6bcf2232ab1e178da1f8ee5e0d1c454c16195
diff --git a/garnet/public/rust/fuchsia-inspect/BUILD.gn b/garnet/public/rust/fuchsia-inspect/BUILD.gn
index 1930ccb..0c0b640 100644
--- a/garnet/public/rust/fuchsia-inspect/BUILD.gn
+++ b/garnet/public/rust/fuchsia-inspect/BUILD.gn
@@ -13,6 +13,7 @@
   deps = [
     "//garnet/public/lib/fidl/rust/fidl",
     "//garnet/public/rust/fuchsia-async",
+    "//garnet/public/rust/fuchsia-component",
     "//garnet/public/rust/fuchsia-syslog",
     "//garnet/public/rust/fuchsia-zircon",
     "//garnet/public/rust/mapped-vmo",
diff --git a/garnet/public/rust/fuchsia-inspect/src/vmo/mod.rs b/garnet/public/rust/fuchsia-inspect/src/vmo/mod.rs
index 845a8c4..b40049a 100644
--- a/garnet/public/rust/fuchsia-inspect/src/vmo/mod.rs
+++ b/garnet/public/rust/fuchsia-inspect/src/vmo/mod.rs
@@ -3,6 +3,8 @@
 // found in the LICENSE file.
 
 use failure::{format_err, Error};
+use fuchsia_component::server::{ServiceFs, ServiceObjTrait};
+use fuchsia_zircon::{self as zx, HandleBased};
 use mapped_vmo::Mapping;
 use parking_lot::Mutex;
 use paste;
@@ -61,8 +63,27 @@
 /// Root API for inspect. Used to create the VMO and get the root node.
 impl Inspector {
     /// Create a new Inspect VMO object with the given maximum size.
-    pub fn new(max_size: usize) -> Result<Self, Error> {
-        let (mapping, _) = Mapping::allocate(max_size)
+    pub fn new<ServiceObjTy: ServiceObjTrait>(
+        max_size: usize,
+        fs: &mut ServiceFs<ServiceObjTy>,
+    ) -> Result<Self, Error> {
+        let (vmo, root_node) = Inspector::new_root(max_size)?;
+        fs.dir("objects").add_vmo_file_at(
+            "root.inspect",
+            vmo.duplicate_handle(zx::Rights::BASIC | zx::Rights::READ | zx::Rights::MAP)?,
+            0, /* vmo offset */
+            max_size as u64,
+        );
+        Ok(Inspector { root_node })
+    }
+
+    /// Get the root of the VMO object.
+    pub fn root(&self) -> &Node {
+        &self.root_node
+    }
+
+    fn new_root(max_size: usize) -> Result<(zx::Vmo, Node), Error> {
+        let (mapping, vmo) = Mapping::allocate(max_size)
             .map_err(|e| format_err!("failed to allocate vmo zx status={}", e))?;
         let heap = Heap::new(Rc::new(mapping))?;
         let state = State::create(heap)?;
@@ -71,12 +92,7 @@
             constants::ROOT_NAME,
             constants::ROOT_PARENT_INDEX,
         )?;
-        Ok(Inspector { root_node })
-    }
-
-    /// Get the root of the VMO object.
-    pub fn root(&self) -> &Node {
-        &self.root_node
+        Ok((vmo, root_node))
     }
 }
 
@@ -254,8 +270,8 @@
 
     #[test]
     fn inspector() {
-        let inspector = Inspector::new(4096).unwrap();
-        let root_name_block = inspector.root().state.lock().heap.get_block(2).unwrap();
+        let (_, root_node) = Inspector::new_root(4096).unwrap();
+        let root_name_block = root_node.state.lock().heap.get_block(2).unwrap();
         assert_eq!(root_name_block.name_contents().unwrap(), constants::ROOT_NAME);
     }