1use clap::Clap;
2
3use super::{Result, DEFAULT_URL};
4use crate::proto::{CreateUnitRequest, ListUnitsRequest, UnitClient, UnitSpec};
5
6#[derive(Clap)]
7pub struct Command {
8 #[clap(subcommand)]
9 subcmd: SubCommand,
10}
11
12impl Command {
13 #[tokio::main(flavor = "current_thread")]
14 pub async fn run(&self) {
15 let result = match &self.subcmd {
16 SubCommand::List(cmd) => cmd.run().await,
17 SubCommand::Create(cmd) => cmd.run().await,
18 };
19 result.unwrap();
20 }
21}
22
23#[derive(Clap)]
24enum SubCommand {
25 List(ListCommand),
26 Create(CreateCommand),
27}
28
29#[derive(Clap)]
30struct ListCommand {
31 #[clap(default_value = DEFAULT_URL)]
32 url: String,
33}
34
35impl ListCommand {
36 async fn run(&self) -> Result<()> {
37 let mut cli = UnitClient::connect(self.url.clone()).await?;
38 let req = ListUnitsRequest {};
39 let res = cli.list_units(req).await?;
40 println!("{:#?}", res.into_inner().descs);
41 Ok(())
42 }
43}
44
45#[derive(Clap)]
46struct CreateCommand {
47 #[clap(long, default_value = DEFAULT_URL)]
48 url: String,
49 #[clap(long)]
50 kind: String,
51}
52
53impl CreateCommand {
54 async fn run(&self) -> Result<()> {
55 let mut cli = UnitClient::connect(self.url.clone()).await?;
56 let spec = UnitSpec {
57 kind: self.kind.clone(),
58 };
59 let req = CreateUnitRequest { spec: Some(spec) };
60 let res = cli.create_unit(req).await?;
61 let desc = res.into_inner().desc;
62 println!("created unit {:#?}", desc);
63 Ok(())
64 }
65}