1use crate::utils::{row_split::CsvRowSplitter, util::get_valid_sep};
2use clap::Args;
3
4#[derive(Debug, Args)]
5pub struct Count {
6 pub filename: Option<String>,
8 #[arg(long, default_value_t = false)]
10 pub no_header: bool,
11 #[arg(short = 'S', long, default_value_t = 0)]
13 pub sheet: usize,
14}
15
16#[derive(Debug, Args)]
17pub struct Size {
18 pub filename: Option<String>,
20}
21
22#[derive(Debug, Args)]
23pub struct Estimate {
24 pub filename: Option<String>,
26 #[arg(short = 'S', long, default_value_t = 0)]
28 pub sheet: usize,
29}
30
31#[derive(Debug, Args)]
32pub struct Head {
33 pub filename: Option<String>,
35 #[arg(long, default_value_t = false)]
37 pub no_header: bool,
38 #[arg(short, long, default_value_t = 10)]
40 pub n: usize,
41 #[arg(short = 'S', long, default_value_t = 0)]
43 pub sheet: usize,
44 #[arg(short = 'E', long, default_value_t = false)]
46 pub export: bool,
47 #[arg(short, long, default_value_t = ',', value_parser=get_valid_sep)]
49 pub sep: char,
50 #[arg(short, long, default_value_t = '"')]
52 pub quote: char,
53}
54
55#[derive(Debug, Args)]
56pub struct Tail {
57 pub filename: Option<String>,
59 #[arg(long, default_value_t = false)]
61 pub no_header: bool,
62 #[arg(short, long, default_value_t = 10)]
64 pub n: usize,
65 #[arg(short = 'S', long, default_value_t = 0)]
67 pub sheet: usize,
68 #[arg(short = 'E', long, default_value_t = false)]
70 pub export: bool,
71}
72
73#[derive(Debug, Args)]
74pub struct Headers {
75 pub filename: Option<String>,
77 #[arg(short, long, default_value_t = ',', value_parser=get_valid_sep)]
79 pub sep: char,
80 #[arg(short, long, default_value_t = '"')]
82 pub quote: char,
83 #[arg(short = 'S', long, default_value_t = 0)]
85 pub sheet: usize,
86}
87
88#[derive(Debug, Args)]
89pub struct Clean {
90 pub filename: Option<String>,
92 #[arg(short, long, default_value_t = String::from(""), hide_default_value=true)]
94 pub output: String,
95 #[arg(short, long, default_value_t = String::from("\""))]
97 pub escape: String,
98}
99
100#[derive(Debug, Args)]
101pub struct Flatten {
102 pub filename: Option<String>,
104 #[arg(short, long, default_value_t = ',', value_parser=get_valid_sep)]
106 pub sep: char,
107 #[arg(short, long, default_value_t = '"')]
109 pub quote: char,
110 #[arg(long, default_value_t = false)]
112 pub no_header: bool,
113 #[arg(short, long, default_value_t = String::from("#"))]
115 pub delimiter: String,
116 #[arg(short, long, default_value_t = 5)]
118 pub n: i32,
119 #[arg(short = 'S', long, default_value_t = 0)]
121 pub sheet: usize,
122}
123
124#[derive(Debug, Args)]
125pub struct Frequency {
126 pub filename: Option<String>,
128 #[arg(short, long, default_value_t = ',', value_parser=get_valid_sep)]
130 pub sep: char,
131 #[arg(short, long, default_value_t = '"')]
133 pub quote: char,
134 #[arg(long, default_value_t = false)]
136 pub no_header: bool,
137 #[arg(short, long, default_value_t = String::from("0"), allow_hyphen_values=true)]
139 pub cols: String,
140 #[arg(short, long, default_value_t = false)]
142 pub ascending: bool,
143 #[arg(short = 'E', long, default_value_t = false)]
145 pub export: bool,
146 #[arg(short, long, default_value_t = -1)]
148 pub n: i32,
149 #[arg(short = 'S', long, default_value_t = 0)]
151 pub sheet: usize,
152}
153
154#[derive(Debug, Args)]
155pub struct Split {
156 pub filename: Option<String>,
158 #[arg(short, long, default_value_t = ',', value_parser=get_valid_sep)]
160 pub sep: char,
161 #[arg(short, long, default_value_t = '"')]
163 pub quote: char,
164 #[arg(long, default_value_t = false)]
166 pub no_header: bool,
167 #[arg(short, long, default_value_t = 0)]
169 pub col: usize,
170 #[arg(short = 'S', long, default_value_t = 0)]
172 pub sheet: usize,
173 #[arg(long)]
175 pub size: Option<usize>,
176}
177
178#[derive(Debug, Args)]
179pub struct Slice {
180 pub filename: Option<String>,
182 #[arg(short, long, default_value_t = 0)]
184 pub start: usize,
185 #[arg(short, long)]
187 pub end: Option<usize>,
188 #[arg(short, long)]
190 pub length: Option<usize>,
191 #[arg(short, long)]
193 pub index: Option<usize>,
194 #[arg(long, default_value_t = false)]
196 pub no_header: bool,
197 #[arg(short = 'E', long, default_value_t = false)]
199 pub export: bool,
200 #[arg(short = 'S', long, default_value_t = 0)]
202 pub sheet: usize,
203}
204
205#[derive(Debug, Args)]
206pub struct Select {
207 pub filename: Option<String>,
209 #[arg(short, long, default_value_t = ',', value_parser=get_valid_sep)]
211 pub sep: char,
212 #[arg(short, long, default_value_t = ',')]
214 pub quote: char,
215 #[arg(long, default_value_t = false)]
217 pub no_header: bool,
218 #[arg(short, long, default_value_t = String::from(""), allow_hyphen_values=true)]
220 pub cols: String,
221 #[arg(short, long, default_value_t = String::from(""), allow_hyphen_values=true)]
223 pub filter: String,
224 #[arg(short = 'E', long, default_value_t = false)]
226 pub export: bool,
227 #[arg(short = 'S', long, default_value_t = 0)]
229 pub sheet: usize,
230}
231
232#[derive(Debug, Args)]
233pub struct Stats {
234 pub filename: Option<String>,
236 #[arg(short, long, default_value_t = ',', value_parser=get_valid_sep)]
238 pub sep: char,
239 #[arg(short, long, default_value_t = ',')]
241 pub quote: char,
242 #[arg(long, default_value_t = false)]
244 pub no_header: bool,
245 #[arg(short, long, default_value_t = String::from(""), allow_hyphen_values=true)]
247 pub cols: String,
248 #[arg(short = 'E', long, default_value_t = false)]
250 pub export: bool,
251 #[arg(short = 'S', long, default_value_t = 0)]
253 pub sheet: usize,
254}
255
256#[derive(Debug, Args)]
257pub struct Excel2csv {
258 pub filename: Option<String>,
260 #[arg(short = 'S', long, default_value_t = 0)]
262 pub sheet: usize,
263 #[arg(short, long, default_value_t = ',', value_parser=get_valid_sep)]
265 pub sep: char,
266 #[arg(short, long, default_value_t = '"')]
268 pub quote: char,
269}
270
271#[derive(Debug, Args)]
272pub struct Table {
273 pub filename: Option<String>,
275 #[arg(short = 'S', long, default_value_t = 0)]
277 pub sheet: usize,
278 #[arg(short, long, default_value_t = ',', value_parser=get_valid_sep)]
280 pub sep: char,
281 #[arg(short, long, default_value_t = '"')]
283 pub quote: char,
284}
285
286#[derive(Debug, Args)]
287pub struct Search {
288 pub pattern: String,
290 pub filename: Option<String>,
292 #[arg(long, default_value_t = false)]
294 pub no_header: bool,
295 #[arg(short, long, default_value_t = ',', value_parser=get_valid_sep)]
297 pub sep: char,
298 #[arg(short, long, default_value_t = '"')]
300 pub quote: char,
301 #[arg(short, long, default_value_t = String::from(""), allow_hyphen_values=true)]
303 pub filter: String,
304 #[arg(short, long, default_value_t = String::from(""), allow_hyphen_values=true)]
306 pub cols: String,
307 #[arg(short = 'S', long, default_value_t = String::from("0"), allow_hyphen_values = true)]
309 pub sheet: String,
310 #[arg(short = 'E', long, default_value_t = false)]
312 pub export: bool,
313}
314
315#[derive(Debug, Args)]
316pub struct Sort {
317 pub filename: Option<String>,
319 #[arg(short, long, default_value_t=',', value_parser=get_valid_sep )]
321 pub sep: char,
322 #[arg(short, long, default_value_t = '"')]
324 pub quote: char,
325 #[arg(long, default_value_t = false)]
327 pub no_header: bool,
328 #[arg(short, long, default_value_t = String::from("0"), allow_hyphen_values=true)]
331 pub cols: String,
332 #[arg(short = 'S', long, default_value_t = 0)]
334 pub sheet: usize,
335 #[arg(short = 'E', long, default_value_t = false)]
337 pub export: bool,
338}
339
340#[derive(Debug, Args)]
341pub struct Sample {
342 pub filename: Option<String>,
344 #[arg(long, default_value_t = false)]
346 pub no_header: bool,
347 #[arg(short = 'S', long, default_value_t = 0)]
349 pub sheet: usize,
350 #[arg(short, long, default_value_t = 10)]
352 pub n: usize,
353 #[arg(long)]
355 pub seed: Option<usize>,
356 #[arg(short = 'E', long, default_value_t = false)]
358 pub export: bool,
359 #[arg(long, long, default_value_t = false)]
361 pub show_number: bool,
362 #[arg(short, long, default_value_t = 0.0)]
364 pub time_limit: f32,
365}
366
367#[derive(Debug, Args)]
368pub struct To {
369 pub out: String,
371 pub filename: Option<String>,
373 #[arg(long, default_value_t = false)]
375 pub no_header: bool,
376 #[arg(short, long, default_value_t = ',', value_parser=get_valid_sep)]
378 pub sep: char,
379 #[arg(short, long, default_value_t = '"')]
381 pub quote: char,
382 #[arg(short = 'S', long, default_value_t = 0)]
384 pub sheet: usize,
385}
386
387#[derive(Debug, Args)]
388pub struct Unique {
389 pub filename: Option<String>,
391 #[arg(short, long, default_value_t = ',', value_parser=get_valid_sep)]
393 pub sep: char,
394 #[arg(short, long, default_value_t = '"')]
396 pub quote: char,
397 #[arg(long, default_value_t = false)]
399 pub no_header: bool,
400 #[arg(short, long, default_value_t = String::from("-1"), allow_hyphen_values=true)]
402 pub cols: String,
403 #[arg(long, default_value_t = false)]
405 pub keep_last: bool,
406 #[arg(short = 'S', long, default_value_t = 0)]
408 pub sheet: usize,
409 #[arg(short = 'E', long, default_value_t = false)]
411 pub export: bool,
412}
413
414macro_rules! impl_row_split {
415 ($cmd:ident) => {
416 impl $cmd {
417 #[allow(dead_code)]
418 pub fn split<'a>(&self, row: &'a str) -> CsvRowSplitter<'a> {
419 CsvRowSplitter::new(row, self.sep, self.quote)
420 }
421
422 #[allow(dead_code)]
423 pub fn split_row_to_vec<'a>(&self, row: &'a str) -> Vec<&'a str> {
424 CsvRowSplitter::new(row, self.sep, self.quote).collect()
425 }
426
427 #[allow(dead_code)]
428 pub fn split_row_to_owned_vec<'a>(&self, row: &'a str) -> Vec<String> {
429 CsvRowSplitter::new(row, self.sep, self.quote)
430 .map(|i| i.to_owned())
431 .collect::<Vec<_>>()
432 }
433
434 #[allow(dead_code)]
435 pub fn row_field_count<'a>(&self, row: &'a str) -> usize {
436 CsvRowSplitter::new(row, self.sep, self.quote).count()
437 }
438 }
439 };
440}
441
442impl_row_split!(Head);
443impl_row_split!(Headers);
444impl_row_split!(Frequency);
445impl_row_split!(Select);
446impl_row_split!(Stats);
447impl_row_split!(To);
448impl_row_split!(Flatten);
449impl_row_split!(Unique);
450impl_row_split!(Search);
451impl_row_split!(Table);
452impl_row_split!(Split);
453impl_row_split!(Excel2csv);