microunit/cmd/
unit.rs

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}