1use clap::{Parser, Subcommand, ValueEnum};
2use strum_macros::Display;
3
4#[derive(Parser)]
5#[clap(author, about="CLI to manage Azure DevOps Personal Access Tokens (PAT)", long_about = None)]
6#[clap(arg_required_else_help = true)]
7pub struct Cli {
8 #[clap(subcommand)]
9 pub command: Option<Commands>,
10 #[clap(flatten)]
11 pub verbose: clap_verbosity_flag::Verbosity,
12 #[clap(long, help = "Print version information")]
13 pub version: bool,
14}
15
16#[derive(Subcommand)]
17pub enum Commands {
18 Create(CreateOpts),
20 List(ListOpts),
22 Get(GetOpts),
24 Delete(DeleteOpts),
26 Update,
28}
29#[derive(Parser)]
30pub struct CreateOpts {
31 #[arg(help = "Display name of the PAT token")]
32 pub name: Option<String>,
33 #[arg(
34 long,
35 short,
36 default_value = "120",
37 help = "Number of seconds the token should be valid for"
38 )]
39 pub lifetime: i64,
40 #[arg(
41 long,
42 short,
43 value_enum,
44 default_values_t = vec![Scope::Packaging],
45 help = "Scope of the token"
46 )]
47 pub scope: Vec<Scope>,
48 #[arg(short, long, value_enum, default_value_t = Output::StdOut, help = "Output format of the token: print to stdout, write to dotenv or netrc")]
49 pub out: Output,
50}
51
52#[derive(Parser)]
53pub struct ListOpts {
54 #[arg(
55 default_value_t = false,
56 required = false,
57 short,
58 long,
59 help = "Show all tokens, including expired ones"
60 )]
61 pub all: bool,
62}
63
64#[derive(Parser)]
65pub struct DeleteOpts {
66 #[arg(default_value_t = String::from(""), required = false, short, long, help = "Name of the token to delete")]
67 pub name: String,
68 #[arg(default_value_t = String::from(""), required = false, short, long, help = "Id of the token to delete")]
69 pub id: String,
70 #[arg(
71 default_value_t = false,
72 required = false,
73 short,
74 long,
75 help = "Delete all tokens, including expired ones"
76 )]
77 pub all: bool,
78}
79
80#[derive(Parser)]
81pub struct GetOpts {
82 pub id: String,
83 #[arg(short, long, value_enum, default_value_t = Output::StdOut)]
84 pub out: Output,
85}
86
87#[derive(ValueEnum, Clone)]
88pub enum Output {
89 StdOut,
90 DotNetrc,
91 DotEnv,
92}
93
94#[derive(ValueEnum, Clone, Debug, Default, PartialEq, Eq, Display)]
95pub enum Scope {
96 FullAccess,
97 Advsec,
98 AdvsecWrite,
99 AdvsecManage,
100 AgentPools,
101 AgentPoolsManage,
102 Analytics,
103 AuditLog,
104 AuditStreamsManage,
105 Build,
106 BuildExecute,
107 Code,
108 CodeWrite,
109 CodeManage,
110 CodeFull,
111 CodeStatus,
112 ConnectedServer,
113 Dashboards,
114 DashboardsManage,
115 DropWrite,
116 Entitlements,
117 MemberEntitlementManagement,
118 MemberEntitlementManagementWrite,
119 EnvironmentManage,
120 Extension,
121 ExtensionManage,
122 ExtensionData,
123 ExtensionDataWrite,
124 Governance,
125 Gallery,
126 GalleryAcquire,
127 GalleryPublish,
128 GalleryManage,
129 GitHubConnections,
130 GitHubConnectionsManage,
131 Graph,
132 GraphManage,
133 Hooks,
134 HooksWrite,
135 HooksInteract,
136 Identity,
137 IdentityManage,
138 MachineGroupManage,
139 Notification,
140 NotificationWrite,
141 NotificationManage,
142 NotificationDiagnostics,
143 #[default]
144 Packaging,
145 PackagingManage,
146 PackagingWrite,
147 PipelineResourcesUse,
148 PipelineResourcesManage,
149 Profile,
150 Project,
151 ProjectWrite,
152 ProjectManage,
153 Release,
154 ReleaseExecute,
155 ReleaseManage,
156 SecureFilesRead,
157 SecureFilesWrite,
158 SecureFilesManage,
159 Security,
160 SecurityManage,
161 ServiceEndpoint,
162 ServiceEndpointQuery,
163 ServiceEndpointManage,
164 Settings,
165 SettingsWrite,
166 Symbols,
167 SymbolsWrite,
168 SymbolsManage,
169 TaskGroupsRead,
170 TaskGroupsWrite,
171 TaskGroupsManage,
172 Test,
173 TestWrite,
174 ThreadsFull,
175 Tokens,
176 TokensAdministration,
177 VariableGroupsRead,
178 VariableGroupsWrite,
179 VariableGroupsManage,
180 Wiki,
181 WikiWrite,
182 Work,
183 WorkWrite,
184 WorkFull,
185}