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::Enable(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::enable::enable(*subcmd.0, writer, driver_development_proxy)
41                .await
42                .context("Enable subcommand failed")?;
43        }
44        DriverSubCommand::Doctor(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::doctor::doctor(*subcmd.0, driver_development_proxy, writer)
50                .await
51                .context("Doctor subcommand failed")?;
52        }
53        DriverSubCommand::Dump(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::dump::dump(*subcmd.0, writer, driver_development_proxy)
59                .await
60                .context("Dump subcommand failed")?;
61        }
62        DriverSubCommand::List(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::list(*subcmd.0, writer, driver_development_proxy)
68                .await
69                .context("List subcommand failed")?;
70        }
71        DriverSubCommand::ListComposites(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_composites::list_composites(
77                *subcmd.0,
78                writer,
79                driver_development_proxy,
80            )
81            .await
82            .context("ListComposites subcommand failed")?;
83        }
84        DriverSubCommand::ListDevices(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_devices::list_devices(*subcmd.0, driver_development_proxy)
90                .await
91                .context("ListDevices subcommand failed")?;
92        }
93        DriverSubCommand::ListHosts(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_hosts::list_hosts(*subcmd.0, driver_development_proxy)
99                .await
100                .context("ListHosts subcommand failed")?;
101        }
102        DriverSubCommand::ListCompositeNodeSpecs(subcmd) => {
103            let driver_development_proxy = driver_connector
104                .get_driver_development_proxy(subcmd.0.select)
105                .await
106                .context("Failed to get driver development proxy")?;
107            subcommands::list_composite_node_specs::list_composite_node_specs(
108                *subcmd.0,
109                writer,
110                driver_development_proxy,
111            )
112            .await
113            .context("ListCompositeNodeSpecs subcommand failed")?;
114        }
115        DriverSubCommand::Register(subcmd) => {
116            let driver_registrar_proxy = driver_connector
117                .get_driver_registrar_proxy(subcmd.0.select)
118                .await
119                .context("Failed to get driver registrar proxy")?;
120            let driver_development_proxy = driver_connector
121                .get_driver_development_proxy(subcmd.0.select)
122                .await
123                .context("Failed to get driver development proxy")?;
124            subcommands::register::register(
125                *subcmd.0,
126                writer,
127                driver_registrar_proxy,
128                driver_development_proxy,
129            )
130            .await
131            .context("Register subcommand failed")?;
132        }
133        DriverSubCommand::Restart(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::restart::restart(*subcmd.0, writer, driver_development_proxy)
139                .await
140                .context("Restart subcommand failed")?;
141        }
142        DriverSubCommand::Show(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::show::show(*subcmd.0, writer, driver_development_proxy)
148                .await
149                .context("Show subcommand failed")?;
150        }
151        DriverSubCommand::TestNode(subcmd) => {
152            let driver_development_proxy = driver_connector
153                .get_driver_development_proxy(subcmd.0.select)
154                .await
155                .context("Failed to get driver development proxy")?;
156            subcommands::test_node::test_node(&subcmd.0, driver_development_proxy)
157                .await
158                .context("TestNode subcommand failed")?;
159        }
160        DriverSubCommand::Node(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::node::node(*subcmd.0, writer, driver_development_proxy)
166                .await
167                .context("Node subcommand failed")?;
168        }
169        DriverSubCommand::Host(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::host::host(*subcmd.0, writer, driver_development_proxy)
175                .await
176                .context("Host subcommand failed")?;
177        }
178        DriverSubCommand::Composite(subcmd) => {
179            let driver_development_proxy = driver_connector
180                .get_driver_development_proxy(cmd.select)
181                .await
182                .context("Failed to get driver development proxy")?;
183            subcommands::composite::composite(*subcmd.0, writer, driver_development_proxy)
184                .await
185                .context("Composite subcommand failed")?;
186        }
187        #[cfg(not(target_os = "fuchsia"))]
188        DriverSubCommand::StaticChecks(subcmd) => {
189            static_checks_lib::static_checks(*subcmd.0, writer)
190                .await
191                .context("StaticChecks subcommand failed")?;
192        }
193    }
194
195    Ok(())
196}
197
198pub fn is_machine_supported(cmd: &DriverCommand) -> bool {
199    match &cmd.subcommand {
200        DriverSubCommand::Host(host_cmd) => {
201            matches!(host_cmd.0.subcommand, HostSubcommand::List(_) | HostSubcommand::Show(_))
202        }
203        DriverSubCommand::Node(node_cmd) => {
204            matches!(node_cmd.0.subcommand, NodeSubcommand::List(_) | NodeSubcommand::Show(_))
205        }
206        _ => false,
207    }
208}
209
210pub async fn driver_machine(
211    cmd: DriverCommand,
212    driver_connector: impl DriverConnector,
213) -> Result<Option<serde_json::Value>> {
214    match cmd.subcommand {
215        DriverSubCommand::Node(node_cmd) => {
216            let driver_development_proxy = driver_connector
217                .get_driver_development_proxy(cmd.select)
218                .await
219                .context("Failed to get driver development proxy")?;
220            subcommands::node::node_machine(&node_cmd.0, &driver_development_proxy).await
221        }
222        DriverSubCommand::Host(host_cmd) => {
223            let driver_development_proxy = driver_connector
224                .get_driver_development_proxy(cmd.select)
225                .await
226                .context("Failed to get driver development proxy")?;
227            subcommands::host::host_machine(&host_cmd.0, &driver_development_proxy).await
228        }
229        _ => Ok(None),
230    }
231}