component_debug/cli/
reload.rs

1// Copyright 2023 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::cli::format::{format_action_error, format_resolve_error, format_start_error};
6use crate::lifecycle::{resolve_instance, start_instance, unresolve_instance};
7use crate::query::get_cml_moniker_from_query;
8use anyhow::Result;
9use fidl_fuchsia_sys2 as fsys;
10
11pub async fn reload_cmd<W: std::io::Write>(
12    query: String,
13    lifecycle_controller: fsys::LifecycleControllerProxy,
14    realm_query: fsys::RealmQueryProxy,
15    mut writer: W,
16) -> Result<()> {
17    let moniker = get_cml_moniker_from_query(&query, &realm_query).await?;
18
19    writeln!(writer, "Moniker: {}", moniker)?;
20    writeln!(writer, "Unresolving component instance...")?;
21
22    unresolve_instance(&lifecycle_controller, &moniker)
23        .await
24        .map_err(|e| format_action_error(&moniker, e))?;
25
26    writeln!(writer, "Resolving component instance...")?;
27
28    resolve_instance(&lifecycle_controller, &moniker)
29        .await
30        .map_err(|e| format_resolve_error(&moniker, e))?;
31
32    writeln!(writer, "Starting component instance...")?;
33
34    let _ = start_instance(&lifecycle_controller, &moniker)
35        .await
36        .map_err(|e| format_start_error(&moniker, e))?;
37
38    writeln!(writer, "Reloaded component instance!")?;
39    Ok(())
40}
41
42#[cfg(test)]
43mod test {
44    use super::*;
45    use crate::test_utils::{serve_lifecycle_controller, serve_realm_query_instances};
46
47    #[fuchsia_async::run_singlethreaded(test)]
48    async fn test_success() -> Result<()> {
49        let mut output = Vec::new();
50        let lifecycle_controller = serve_lifecycle_controller("/core/ffx-laboratory:test");
51        let realm_query = serve_realm_query_instances(vec![fsys::Instance {
52            moniker: Some("/core/ffx-laboratory:test".to_string()),
53            url: Some("fuchsia-pkg://fuchsia.com/test#meta/test.cml".to_string()),
54            instance_id: None,
55            resolved_info: None,
56            ..Default::default()
57        }]);
58        let response =
59            reload_cmd("test".to_string(), lifecycle_controller, realm_query, &mut output).await;
60        response.unwrap();
61        Ok(())
62    }
63}