component_debug/cli/
doctor.rs
1use 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}