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