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