Skip to main content

driver_tools/
lib.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
5pub mod args;
6mod common;
7pub mod subcommands;
8
9use anyhow::{Context, Result};
10use args::{DriverCommand, DriverSubCommand};
11use driver_connector::DriverConnector;
12use std::io;
13use subcommands::host::args::HostSubcommand;
14use subcommands::node::args::NodeSubcommand;
15
16pub async fn driver(
17    cmd: DriverCommand,
18    driver_connector: impl DriverConnector,
19    writer: &mut dyn io::Write,
20) -> Result<()> {
21    match cmd.subcommand {
22        DriverSubCommand::Disable(subcmd) => {
23            let driver_development_proxy = driver_connector
24                .get_driver_development_proxy(subcmd.0.select)
25                .await
26                .context("Failed to get driver development proxy")?;
27            subcommands::disable::disable(*subcmd.0, writer, driver_development_proxy)
28                .await
29                .context("Disable subcommand failed")?;
30        }
31        DriverSubCommand::Doctor(subcmd) => {
32            let driver_development_proxy = driver_connector
33                .get_driver_development_proxy(subcmd.0.select)
34                .await
35                .context("Failed to get driver development proxy")?;
36            subcommands::doctor::doctor(*subcmd.0, driver_development_proxy, writer)
37                .await
38                .context("Doctor subcommand failed")?;
39        }
40        DriverSubCommand::Dump(subcmd) => {
41            let driver_development_proxy = driver_connector
42                .get_driver_development_proxy(subcmd.0.select)
43                .await
44                .context("Failed to get driver development proxy")?;
45            subcommands::dump::dump(*subcmd.0, writer, driver_development_proxy)
46                .await
47                .context("Dump subcommand failed")?;
48        }
49        DriverSubCommand::List(subcmd) => {
50            let driver_development_proxy = driver_connector
51                .get_driver_development_proxy(subcmd.0.select)
52                .await
53                .context("Failed to get driver development proxy")?;
54            subcommands::list::list(*subcmd.0, writer, driver_development_proxy)
55                .await
56                .context("List subcommand failed")?;
57        }
58        DriverSubCommand::ListComposites(subcmd) => {
59            let driver_development_proxy = driver_connector
60                .get_driver_development_proxy(subcmd.0.select)
61                .await
62                .context("Failed to get driver development proxy")?;
63            subcommands::list_composites::list_composites(
64                *subcmd.0,
65                writer,
66                driver_development_proxy,
67            )
68            .await
69            .context("ListComposites subcommand failed")?;
70        }
71        DriverSubCommand::ListDevices(subcmd) => {
72            let driver_development_proxy = driver_connector
73                .get_driver_development_proxy(subcmd.0.select)
74                .await
75                .context("Failed to get driver development proxy")?;
76            subcommands::list_devices::list_devices(*subcmd.0, driver_development_proxy)
77                .await
78                .context("ListDevices subcommand failed")?;
79        }
80        DriverSubCommand::ListHosts(subcmd) => {
81            let driver_development_proxy = driver_connector
82                .get_driver_development_proxy(subcmd.0.select)
83                .await
84                .context("Failed to get driver development proxy")?;
85            subcommands::list_hosts::list_hosts(*subcmd.0, driver_development_proxy)
86                .await
87                .context("ListHosts subcommand failed")?;
88        }
89        DriverSubCommand::ListCompositeNodeSpecs(subcmd) => {
90            let driver_development_proxy = driver_connector
91                .get_driver_development_proxy(subcmd.0.select)
92                .await
93                .context("Failed to get driver development proxy")?;
94            subcommands::list_composite_node_specs::list_composite_node_specs(
95                *subcmd.0,
96                writer,
97                driver_development_proxy,
98            )
99            .await
100            .context("ListCompositeNodeSpecs subcommand failed")?;
101        }
102        DriverSubCommand::Register(subcmd) => {
103            let driver_registrar_proxy = driver_connector
104                .get_driver_registrar_proxy(subcmd.0.select)
105                .await
106                .context("Failed to get driver registrar proxy")?;
107            let driver_development_proxy = driver_connector
108                .get_driver_development_proxy(subcmd.0.select)
109                .await
110                .context("Failed to get driver development proxy")?;
111            subcommands::register::register(
112                *subcmd.0,
113                writer,
114                driver_registrar_proxy,
115                driver_development_proxy,
116            )
117            .await
118            .context("Register subcommand failed")?;
119        }
120        DriverSubCommand::Restart(subcmd) => {
121            let driver_development_proxy = driver_connector
122                .get_driver_development_proxy(subcmd.0.select)
123                .await
124                .context("Failed to get driver development proxy")?;
125            subcommands::restart::restart(*subcmd.0, writer, driver_development_proxy)
126                .await
127                .context("Restart subcommand failed")?;
128        }
129        DriverSubCommand::Show(subcmd) => {
130            let driver_development_proxy = driver_connector
131                .get_driver_development_proxy(subcmd.0.select)
132                .await
133                .context("Failed to get driver development proxy")?;
134            subcommands::show::show(*subcmd.0, writer, driver_development_proxy)
135                .await
136                .context("Show subcommand failed")?;
137        }
138        DriverSubCommand::TestNode(subcmd) => {
139            let driver_development_proxy = driver_connector
140                .get_driver_development_proxy(subcmd.0.select)
141                .await
142                .context("Failed to get driver development proxy")?;
143            subcommands::test_node::test_node(&subcmd.0, driver_development_proxy)
144                .await
145                .context("TestNode subcommand failed")?;
146        }
147        DriverSubCommand::Node(subcmd) => {
148            let driver_development_proxy = driver_connector
149                .get_driver_development_proxy(cmd.select)
150                .await
151                .context("Failed to get driver development proxy")?;
152            subcommands::node::node(*subcmd.0, writer, driver_development_proxy)
153                .await
154                .context("Node subcommand failed")?;
155        }
156        DriverSubCommand::Host(subcmd) => {
157            let driver_development_proxy = driver_connector
158                .get_driver_development_proxy(cmd.select)
159                .await
160                .context("Failed to get driver development proxy")?;
161            subcommands::host::host(*subcmd.0, writer, driver_development_proxy)
162                .await
163                .context("Host subcommand failed")?;
164        }
165        DriverSubCommand::Composite(subcmd) => {
166            let driver_development_proxy = driver_connector
167                .get_driver_development_proxy(cmd.select)
168                .await
169                .context("Failed to get driver development proxy")?;
170            subcommands::composite::composite(*subcmd.0, writer, driver_development_proxy)
171                .await
172                .context("Composite subcommand failed")?;
173        }
174        #[cfg(not(target_os = "fuchsia"))]
175        DriverSubCommand::StaticChecks(subcmd) => {
176            static_checks_lib::static_checks(*subcmd.0, writer)
177                .await
178                .context("StaticChecks subcommand failed")?;
179        }
180    }
181
182    Ok(())
183}
184
185pub fn is_machine_supported(cmd: &DriverCommand) -> bool {
186    match &cmd.subcommand {
187        DriverSubCommand::Host(host_cmd) => {
188            matches!(host_cmd.0.subcommand, HostSubcommand::List(_) | HostSubcommand::Show(_))
189        }
190        DriverSubCommand::Node(node_cmd) => {
191            matches!(node_cmd.0.subcommand, NodeSubcommand::List(_) | NodeSubcommand::Show(_))
192        }
193        _ => false,
194    }
195}
196
197pub async fn driver_machine(
198    cmd: DriverCommand,
199    driver_connector: impl DriverConnector,
200) -> Result<Option<serde_json::Value>> {
201    match cmd.subcommand {
202        DriverSubCommand::Node(node_cmd) => {
203            let driver_development_proxy = driver_connector
204                .get_driver_development_proxy(cmd.select)
205                .await
206                .context("Failed to get driver development proxy")?;
207            subcommands::node::node_machine(&node_cmd.0, &driver_development_proxy).await
208        }
209        DriverSubCommand::Host(host_cmd) => {
210            let driver_development_proxy = driver_connector
211                .get_driver_development_proxy(cmd.select)
212                .await
213                .context("Failed to get driver development proxy")?;
214            subcommands::host::host_machine(&host_cmd.0, &driver_development_proxy).await
215        }
216        _ => Ok(None),
217    }
218}