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::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}