nimbus_fml/command_line/
cli.rs1use clap::{Args, Parser, Subcommand, ValueEnum};
6
7use crate::intermediate_representation::TargetLanguage;
8
9#[derive(Parser)]
10#[command(name = "nimbus-fml")]
11#[command(author = "nimbus-dev@mozilla.com")]
12pub struct App {
14 #[clap(subcommand)]
15 pub subcommand: Command,
16}
17
18#[derive(Subcommand)]
19pub enum Command {
20 Generate(Generate),
22
23 GenerateExperimenter(GenerateExperimenter),
25
26 Fetch(Fetch),
28
29 SingleFile(SingleFile),
32
33 Validate(Validate),
35
36 Channels(Channels),
38
39 Info(Info),
41}
42
43#[derive(Args)]
44pub struct Generate {
45 #[arg(value_name = "INPUT")]
47 pub input: String,
48
49 #[arg(value_name = "OUTPUT")]
51 pub output: String,
52
53 #[arg(long)]
55 pub language: Option<Language>,
56
57 #[arg(long)]
59 pub channel: String,
60
61 #[command(flatten)]
62 pub loader_info: LoaderInfo,
63}
64
65#[derive(Args)]
66pub struct GenerateExperimenter {
67 #[arg(value_name = "INPUT")]
69 pub input: String,
70
71 #[arg(value_name = "OUTPUT")]
73 pub output: String,
74
75 #[arg(long)]
77 pub channel: Option<String>,
79
80 #[command(flatten)]
81 pub loader_info: LoaderInfo,
82}
83
84#[derive(Args)]
85pub struct Fetch {
86 #[arg(value_name = "INPUT")]
88 pub input: String,
89
90 #[command(flatten)]
91 pub loader_info: LoaderInfo,
92}
93
94#[derive(Args)]
95pub struct SingleFile {
96 #[arg(value_name = "INPUT")]
98 pub input: String,
99
100 #[arg(value_name = "OUTPUT")]
102 pub output: String,
103
104 #[arg(long)]
106 pub channel: Option<String>,
107
108 #[command(flatten)]
109 pub loader_info: LoaderInfo,
110}
111
112#[derive(Args)]
113pub struct Validate {
114 #[arg(value_name = "INPUT")]
116 pub input: String,
117
118 #[command(flatten)]
119 pub loader_info: LoaderInfo,
120}
121
122#[derive(Args)]
123pub struct Channels {
124 #[arg(value_name = "INPUT")]
126 pub input: String,
127
128 #[command(flatten)]
129 pub loader_info: LoaderInfo,
130
131 #[arg(long)]
133 pub json: bool,
134}
135
136#[derive(Args)]
137pub struct Info {
138 #[arg(value_name = "INPUT")]
140 pub input: String,
141
142 #[arg(long)]
144 pub channel: Option<String>,
145
146 #[arg(long)]
148 pub feature: Option<String>,
149
150 #[command(flatten)]
151 pub loader_info: LoaderInfo,
152
153 #[arg(long)]
155 pub json: bool,
156}
157
158#[derive(Clone, Copy, ValueEnum)]
159pub enum Language {
160 Swift,
161 Kotlin,
162}
163
164#[derive(Args)]
165pub struct LoaderInfo {
166 #[arg(long)]
168 pub cache_dir: Option<String>,
169
170 #[arg(long)]
172 pub repo_file: Vec<String>,
173
174 #[arg(long = "ref")]
176 pub ref_: Option<String>,
177}
178
179impl From<Language> for TargetLanguage {
180 fn from(lang: Language) -> Self {
181 match lang {
182 Language::Swift => Self::Swift,
183 Language::Kotlin => Self::Kotlin,
184 }
185 }
186}