component_debug/cli/
doctor.rs1use 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}