component_debug/cli/
doctor.rs

1// Copyright 2022 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::doctor::{create_tables, validate_routes, RouteReport};
6use crate::query::get_cml_moniker_from_query;
7use anyhow::Result;
8use fidl_fuchsia_sys2 as fsys;
9use moniker::Moniker;
10
11pub async fn doctor_cmd_print<W: std::io::Write>(
12    query: String,
13    route_validator: fsys::RouteValidatorProxy,
14    realm_query: fsys::RealmQueryProxy,
15    mut writer: W,
16) -> Result<()> {
17    let moniker = get_cml_moniker_from_query(&query, &realm_query).await?;
18    writeln!(writer, "Moniker: {}", &moniker)?;
19
20    let reports = validate_routes(&route_validator, &moniker).await?;
21    write_result_table(&moniker, &reports, writer)?;
22    Ok(())
23}
24
25pub fn write_result_table<W: std::io::Write>(
26    moniker: &Moniker,
27    reports: &Vec<RouteReport>,
28    mut writer: W,
29) -> Result<()> {
30    let (use_table, expose_table) = create_tables(reports);
31    use_table.print(&mut writer)?;
32    writeln!(writer, "")?;
33
34    expose_table.print(&mut writer)?;
35    writeln!(writer, "")?;
36
37    let mut error_capabilities =
38        reports.iter().filter(|r| r.error_summary.is_some()).map(|r| &r.capability).peekable();
39    if error_capabilities.peek().is_some() {
40        writeln!(writer, "For further diagnosis, try:\n")?;
41        for cap in error_capabilities {
42            writeln!(writer, "  $ ffx component route {} {}", moniker, cap)?;
43        }
44    }
45    Ok(())
46}
47
48pub async fn doctor_cmd_serialized(
49    query: String,
50    route_validator: fsys::RouteValidatorProxy,
51    realm_query: fsys::RealmQueryProxy,
52) -> Result<Vec<RouteReport>> {
53    let moniker = get_cml_moniker_from_query(&query, &realm_query).await?;
54    validate_routes(&route_validator, &moniker).await
55}