Skip to main content

systemprompt_cli/commands/cloud/profile/
args.rs

1//! Clap argument and command types for `cloud profile`.
2
3use clap::{Args, Subcommand, ValueEnum};
4use systemprompt_models::none_if_blank;
5
6#[derive(Debug, Subcommand)]
7pub enum ProfileCommands {
8    #[command(about = "Create a new profile", hide = true)]
9    Create(CreateArgs),
10
11    #[command(about = "List all profiles")]
12    List,
13
14    #[command(
15        about = "Show profile configuration",
16        after_help = "EXAMPLES:\n  systemprompt cloud profile show\n  systemprompt cloud profile \
17                      show --filter agents\n  systemprompt cloud profile show --json"
18    )]
19    Show {
20        name: Option<String>,
21
22        #[arg(short, long, value_enum, default_value = "all")]
23        filter: ShowFilter,
24
25        #[arg(long, help = "Output as JSON")]
26        json: bool,
27
28        #[arg(long, help = "Output as YAML")]
29        yaml: bool,
30    },
31
32    #[command(about = "Delete a profile")]
33    Delete(DeleteArgs),
34
35    #[command(about = "Edit profile configuration")]
36    Edit(EditArgs),
37}
38
39#[derive(Debug, Args)]
40pub struct DeleteArgs {
41    pub name: String,
42
43    #[arg(short = 'y', long, help = "Skip confirmation prompts")]
44    pub yes: bool,
45}
46
47#[derive(Debug, Args)]
48pub struct CreateArgs {
49    pub name: String,
50
51    #[arg(
52        long = "tenant-id",
53        env = "SYSTEMPROMPT_TENANT_ID",
54        help = "Tenant ID (required in non-interactive mode)"
55    )]
56    pub tenant: Option<String>,
57
58    #[arg(long, value_enum, default_value = "local", help = "Tenant type")]
59    pub tenant_type: TenantTypeArg,
60
61    #[arg(long, env = "ANTHROPIC_API_KEY", help = "Anthropic (Claude) API key")]
62    pub anthropic_key: Option<String>,
63
64    #[arg(long, env = "OPENAI_API_KEY", help = "OpenAI (GPT) API key")]
65    pub openai_key: Option<String>,
66
67    #[arg(long, env = "GEMINI_API_KEY", help = "Google AI (Gemini) API key")]
68    pub gemini_key: Option<String>,
69
70    #[arg(long, env = "GITHUB_TOKEN", help = "GitHub token (optional)")]
71    pub github_token: Option<String>,
72}
73
74impl CreateArgs {
75    pub const fn has_api_key(&self) -> bool {
76        self.anthropic_key.is_some() || self.openai_key.is_some() || self.gemini_key.is_some()
77    }
78
79    #[must_use]
80    pub fn normalized(mut self) -> Self {
81        self.anthropic_key = none_if_blank(self.anthropic_key);
82        self.openai_key = none_if_blank(self.openai_key);
83        self.gemini_key = none_if_blank(self.gemini_key);
84        self.github_token = none_if_blank(self.github_token);
85        self
86    }
87}
88
89#[derive(Clone, Copy, Debug, ValueEnum)]
90pub enum TenantTypeArg {
91    Local,
92    Cloud,
93}
94
95#[derive(Debug, Args)]
96pub struct EditArgs {
97    pub name: Option<String>,
98
99    #[arg(long, help = "Set Anthropic API key")]
100    pub set_anthropic_key: Option<String>,
101
102    #[arg(long, help = "Set OpenAI API key")]
103    pub set_openai_key: Option<String>,
104
105    #[arg(long, help = "Set Gemini API key")]
106    pub set_gemini_key: Option<String>,
107
108    #[arg(long, help = "Set GitHub token")]
109    pub set_github_token: Option<String>,
110
111    #[arg(long, help = "Set database URL")]
112    pub set_database_url: Option<String>,
113
114    #[arg(long, help = "Set external URL (cloud profiles)")]
115    pub set_external_url: Option<String>,
116
117    #[arg(long, help = "Set server host")]
118    pub set_host: Option<String>,
119
120    #[arg(long, help = "Set server port")]
121    pub set_port: Option<u16>,
122}
123
124impl EditArgs {
125    pub const fn has_updates(&self) -> bool {
126        self.set_anthropic_key.is_some()
127            || self.set_openai_key.is_some()
128            || self.set_gemini_key.is_some()
129            || self.set_github_token.is_some()
130            || self.set_database_url.is_some()
131            || self.set_external_url.is_some()
132            || self.set_host.is_some()
133            || self.set_port.is_some()
134    }
135}
136
137#[derive(Clone, Copy, Debug, ValueEnum)]
138pub enum ShowFilter {
139    All,
140    Agents,
141    Mcp,
142    Skills,
143    Ai,
144    Web,
145    Content,
146    Env,
147    Settings,
148}