1use std::path::PathBuf;
4
5use clap::{Args, Parser, Subcommand, ValueEnum};
6
7#[derive(Parser)]
8#[command(
9 name = "envo",
10 version,
11 about = "Typed .env manager: schema, profile inheritance, leak detection, encryption",
12 propagate_version = true
13)]
14pub struct Cli {
15 #[arg(short = 'C', long, global = true, value_name = "DIR")]
17 pub dir: Option<PathBuf>,
18
19 #[arg(long, global = true)]
21 pub no_color: bool,
22
23 #[command(subcommand)]
24 pub command: Command,
25}
26
27#[derive(Subcommand)]
28pub enum Command {
29 Init(InitArgs),
31 Check(CheckArgs),
33 List(ListArgs),
35 Run(RunArgs),
37 Export(ExportArgs),
39 Encrypt(CryptoArgs),
41 Decrypt(CryptoArgs),
43 Scan(ScanArgs),
45 Hook(HookArgs),
47}
48
49#[derive(Args)]
50pub struct InitArgs {
51 #[arg(long)]
53 pub force: bool,
54}
55
56#[derive(Args)]
57pub struct CheckArgs {
58 #[arg(short, long, value_name = "NAME")]
60 pub profile: Option<String>,
61 #[arg(long)]
63 pub strict: bool,
64 #[arg(long)]
66 pub no_process_env: bool,
67 #[arg(long, value_name = "FILE")]
69 pub key_file: Option<PathBuf>,
70}
71
72#[derive(Args)]
73pub struct ListArgs {
74 #[arg(short, long, value_name = "NAME")]
76 pub profile: Option<String>,
77 #[arg(long)]
79 pub show_secrets: bool,
80 #[arg(long)]
82 pub json: bool,
83 #[arg(long)]
85 pub process_env: bool,
86 #[arg(long, value_name = "FILE")]
88 pub key_file: Option<PathBuf>,
89}
90
91#[derive(Args)]
92pub struct RunArgs {
93 #[arg(short, long, value_name = "NAME")]
95 pub profile: Option<String>,
96 #[arg(long)]
98 pub no_validate: bool,
99 #[arg(long, value_name = "FILE")]
101 pub key_file: Option<PathBuf>,
102 #[arg(
104 trailing_var_arg = true,
105 allow_hyphen_values = true,
106 required = true,
107 value_name = "CMD"
108 )]
109 pub cmd: Vec<String>,
110}
111
112#[derive(Args)]
113pub struct ExportArgs {
114 #[arg(short, long, value_name = "NAME")]
116 pub profile: Option<String>,
117 #[arg(long, value_enum, default_value_t = ExportFormat::Dotenv)]
119 pub format: ExportFormat,
120 #[arg(long, value_name = "FILE")]
122 pub key_file: Option<PathBuf>,
123}
124
125#[derive(Clone, Copy, ValueEnum)]
126pub enum ExportFormat {
127 Dotenv,
128 Shell,
129 Json,
130}
131
132#[derive(Args)]
133pub struct CryptoArgs {
134 #[arg(short, long, value_name = "FILE")]
136 pub input: Option<PathBuf>,
137 #[arg(short, long, value_name = "FILE")]
139 pub output: Option<PathBuf>,
140 #[arg(long, value_name = "FILE")]
142 pub key_file: Option<PathBuf>,
143}
144
145#[derive(Args)]
146pub struct ScanArgs {
147 #[arg(long)]
149 pub staged: bool,
150 #[arg(long)]
152 pub strict: bool,
153 #[arg(value_name = "PATH")]
155 pub paths: Vec<PathBuf>,
156}
157
158#[derive(Args)]
159pub struct HookArgs {
160 #[command(subcommand)]
161 pub action: HookAction,
162}
163
164#[derive(Subcommand)]
165pub enum HookAction {
166 Install(HookInstallArgs),
168 Uninstall,
170}
171
172#[derive(Args)]
173pub struct HookInstallArgs {
174 #[arg(long)]
176 pub with_check: bool,
177}