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::{HostCommand, HostSubcommand};
14use subcommands::node::args::{NodeCommand, 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::Dump(subcmd) => {
23            let driver_development_proxy = driver_connector
24                .get_driver_development_proxy(subcmd.select)
25                .await
26                .context("Failed to get driver development proxy")?;
27            subcommands::dump::dump(subcmd, writer, driver_development_proxy)
28                .await
29                .context("Dump subcommand failed")?;
30        }
31        DriverSubCommand::List(subcmd) => {
32            let driver_development_proxy = driver_connector
33                .get_driver_development_proxy(subcmd.select)
34                .await
35                .context("Failed to get driver development proxy")?;
36            subcommands::list::list(subcmd, writer, driver_development_proxy)
37                .await
38                .context("List subcommand failed")?;
39        }
40        DriverSubCommand::ListComposites(subcmd) => {
41            let driver_development_proxy = driver_connector
42                .get_driver_development_proxy(subcmd.select)
43                .await
44                .context("Failed to get driver development proxy")?;
45            subcommands::list_composites::list_composites(subcmd, writer, driver_development_proxy)
46                .await
47                .context("List composites subcommand failed")?;
48        }
49        DriverSubCommand::ListDevices(subcmd) => {
50            let driver_development_proxy = driver_connector
51                .get_driver_development_proxy(subcmd.select)
52                .await
53                .context("Failed to get driver development proxy")?;
54            subcommands::list_devices::list_devices(subcmd, driver_development_proxy)
55                .await
56                .context("List-devices subcommand failed")?;
57        }
58        DriverSubCommand::ListHosts(subcmd) => {
59            let driver_development_proxy = driver_connector
60                .get_driver_development_proxy(subcmd.select)
61                .await
62                .context("Failed to get driver development proxy")?;
63            subcommands::list_hosts::list_hosts(subcmd, driver_development_proxy)
64                .await
65                .context("List-hosts subcommand failed")?;
66        }
67        DriverSubCommand::ListCompositeNodeSpecs(subcmd) => {
68            let driver_development_proxy = driver_connector
69                .get_driver_development_proxy(subcmd.select)
70                .await
71                .context("Failed to get driver development proxy")?;
72            subcommands::list_composite_node_specs::list_composite_node_specs(
73                subcmd,
74                writer,
75                driver_development_proxy,
76            )
77            .await
78            .context("list-composite-node-specs subcommand failed")?;
79        }
80        DriverSubCommand::Register(subcmd) => {
81            let driver_registrar_proxy = driver_connector
82                .get_driver_registrar_proxy(subcmd.select)
83                .await
84                .context("Failed to get driver registrar proxy")?;
85            let driver_development_proxy = driver_connector
86                .get_driver_development_proxy(subcmd.select)
87                .await
88                .context("Failed to get driver development proxy")?;
89            subcommands::register::register(
90                subcmd,
91                writer,
92                driver_registrar_proxy,
93                driver_development_proxy,
94            )
95            .await
96            .context("Register subcommand failed")?;
97        }
98        DriverSubCommand::Restart(subcmd) => {
99            let driver_development_proxy = driver_connector
100                .get_driver_development_proxy(subcmd.select)
101                .await
102                .context("Failed to get driver development proxy")?;
103            subcommands::restart::restart(subcmd, writer, driver_development_proxy)
104                .await
105                .context("Restart subcommand failed")?;
106        }
107        #[cfg(not(target_os = "fuchsia"))]
108        DriverSubCommand::StaticChecks(subcmd) => {
109            static_checks_lib::static_checks(subcmd, writer)
110                .await
111                .context("StaticChecks subcommand failed")?;
112        }
113        DriverSubCommand::TestNode(subcmd) => {
114            let driver_development_proxy = driver_connector
115                .get_driver_development_proxy(subcmd.select)
116                .await
117                .context("Failed to get driver development proxy")?;
118            subcommands::test_node::test_node(&subcmd, driver_development_proxy)
119                .await
120                .context("AddTestNode subcommand failed")?;
121        }
122        DriverSubCommand::Disable(subcmd) => {
123            let driver_development_proxy = driver_connector
124                .get_driver_development_proxy(subcmd.select)
125                .await
126                .context("Failed to get driver development proxy")?;
127            subcommands::disable::disable(subcmd, writer, driver_development_proxy)
128                .await
129                .context("Disable subcommand failed")?;
130        }
131        DriverSubCommand::Node(subcmd) => {
132            let driver_development_proxy = driver_connector
133                .get_driver_development_proxy(cmd.select)
134                .await
135                .context("Failed to get driver development proxy")?;
136            subcommands::node::node(subcmd, writer, driver_development_proxy)
137                .await
138                .context("Node subcommand failed")?;
139        }
140        DriverSubCommand::Host(subcmd) => {
141            let driver_development_proxy = driver_connector
142                .get_driver_development_proxy(cmd.select)
143                .await
144                .context("Failed to get driver development proxy")?;
145            subcommands::host::host(subcmd, writer, driver_development_proxy)
146                .await
147                .context("Host subcommand failed")?;
148        }
149    };
150    Ok(())
151}
152
153pub fn is_machine_supported(cmd: &DriverCommand) -> bool {
154    match &cmd.subcommand {
155        DriverSubCommand::Host(HostCommand { subcommand: HostSubcommand::List(_) })
156        | DriverSubCommand::Host(HostCommand { subcommand: HostSubcommand::Show(_) })
157        | DriverSubCommand::Node(NodeCommand { subcommand: NodeSubcommand::List(_) })
158        | DriverSubCommand::Node(NodeCommand { subcommand: NodeSubcommand::Show(_) }) => true,
159        _ => false,
160    }
161}
162
163pub async fn driver_machine(
164    cmd: &DriverCommand,
165    driver_connector: impl DriverConnector,
166) -> Result<Option<serde_json::Value>> {
167    match &cmd.subcommand {
168        DriverSubCommand::Host(host_cmd) => {
169            let driver_development_proxy = driver_connector
170                .get_driver_development_proxy(cmd.select)
171                .await
172                .context("Failed to get driver development proxy")?;
173            subcommands::host::host_machine(host_cmd, &driver_development_proxy).await
174        }
175        DriverSubCommand::Node(node_cmd) => {
176            let driver_development_proxy = driver_connector
177                .get_driver_development_proxy(cmd.select)
178                .await
179                .context("Failed to get driver development proxy")?;
180            subcommands::node::node_machine(node_cmd, &driver_development_proxy).await
181        }
182        _ => Ok(None),
183    }
184}