1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use std::ffi::OsStr;

use clap::{value_parser, Arg, ArgAction, Command, ValueHint};

use crate::CPU_NUM_STRING;

pub fn build_cli() -> Command {
    Command::new("fourier-series")
        .arg(
            Arg::new("epicycle-count")
                .value_parser(value_parser!(u32))
                .default_value("100"),
        )
        .arg(
            Arg::new("period")
                .value_parser(value_parser!(f64))
                .default_value("100"),
        )
        .arg(
            Arg::new("thread-count")
                .value_parser(value_parser!(usize))
                .default_value(OsStr::new(&*CPU_NUM_STRING)),
        )
        .arg(
            Arg::new("integral-segments")
                .value_parser(value_parser!(u32))
                .default_value("1000000"),
        )
        .arg(
            Arg::new("integrator")
                .value_parser(value_parser!(Integrator))
                .short('i')
                .long("integrator")
                .default_value("trapezoid")
                .required(false)
                .help("Numerical integration method"),
        )
        .arg(
            Arg::new("data")
                .required(false)
                .short('d')
                .long("data")
                .help("Input data set file (if not provided, use a built-in test data set)")
                .value_hint(ValueHint::FilePath),
        )
}

#[derive(Clone, clap::ValueEnum, Copy)]
pub enum Integrator {
    Trapezoid,
    LeftRectangle,
    RightRectangle,
    Simpson,
    Simpson38,
    Boole,
}