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