1use clap::*;
2
3use crate::model::{
4 ComponentName, ComposableAppGroupName, ExampleName, GuestLanguage, GuestLanguageTier,
5 PackageName,
6};
7
8#[derive(Args, Debug)]
9#[group(required = true, multiple = false)]
10pub struct NameOrLanguage {
11 #[arg(short, long, group = "ex")]
13 pub example: Option<ExampleName>,
14
15 #[arg(short, long, alias = "lang", group = "ex")]
17 pub language: Option<GuestLanguage>,
18}
19
20impl NameOrLanguage {
21 pub fn example_name(&self) -> ExampleName {
23 self.example
24 .clone()
25 .unwrap_or(ExampleName::from_string(format!(
26 "{}-default",
27 self.language.unwrap_or(GuestLanguage::Rust).id()
28 )))
29 }
30}
31
32#[derive(Subcommand, Debug)]
33#[command()]
34pub enum Command {
35 #[command()]
37 New {
38 #[command(flatten)]
39 name_or_language: NameOrLanguage,
40
41 #[arg(short, long)]
43 package_name: Option<PackageName>,
44
45 component_name: ComponentName,
47 },
48
49 #[command()]
51 ListExamples {
52 #[arg(short, long)]
54 min_tier: Option<GuestLanguageTier>,
55
56 #[arg(short, long, alias = "lang")]
58 language: Option<GuestLanguage>,
59 },
60
61 #[command()]
63 ListAppExamples {
64 #[arg(short, long, alias = "lang")]
66 language: Option<GuestLanguage>,
67
68 #[arg(short, long, alias = "group")]
70 group: Option<ComposableAppGroupName>,
71 },
72
73 NewAppComponent {
74 component_name: PackageName,
76
77 #[arg(short, long, alias = "lang")]
79 language: GuestLanguage,
80 },
81}
82
83#[derive(Parser, Debug)]
84#[command(author, version, about, long_about = None, rename_all = "kebab-case")]
85pub struct GolemCommand {
86 #[command(subcommand)]
87 pub command: Command,
88}