1pub 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}