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