1use crate::config::LinkStrategy;
2use clap::{Parser, Subcommand};
3use std::fmt::Display;
4use std::path::PathBuf;
5
6#[derive(Debug, Default, Clone)]
7pub enum BuildModeCli {
8 #[default]
9 Development,
10 Release,
11}
12impl Display for BuildModeCli {
13 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14 let str = match self {
15 BuildModeCli::Release => "release".to_string(),
16 BuildModeCli::Development => "development".to_string(),
17 };
18 write!(f, "{}", str)
19 }
20}
21
22#[derive(Parser, Debug, Clone)]
23pub struct InitArgs {
24 #[arg(default_value = "./", value_name = "PATH")]
25 pub path: PathBuf,
26
27 #[arg(long, default_value = "false", value_name = "NO_GIT")]
29 pub no_git: bool,
30}
31
32#[derive(Parser, Debug, Clone)]
33pub struct CleanArgs {
34 #[arg(default_value = "./", value_name = "PATH")]
35 pub path: PathBuf,
36
37 #[arg(long)]
39 pub deps_too: bool,
40}
41
42#[derive(Subcommand, Debug, Clone)]
43pub enum CloneSource {
44 Git {
45 #[arg(value_name = "URL")]
46 url: String,
47 #[arg(long, default_value = "master", value_name = "BRANCH")]
48 branch: String,
49 },
50 FileSystem {
51 #[arg(value_name = "PATH")]
52 from: PathBuf,
53 },
54}
55
56#[derive(Parser, Debug, Clone)]
57pub struct CloneArgs {
58 #[arg(default_value = "./", value_name = "PATH")]
59 pub path: PathBuf,
60
61 #[clap(subcommand)]
62 pub source: CloneSource,
63}
64
65#[derive(Parser, Debug, Clone)]
66pub struct CompilationDatabaseArgs {
67 #[arg(default_value = "./", value_name = "PATH")]
68 pub path: PathBuf,
69}
70
71#[derive(Subcommand, Debug, Clone)]
72pub enum BuildToolchain {
73 Default,
75 Named {
77 #[arg(value_name = "NAME")]
78 name: String,
79 },
80 Custom {
82 #[arg(long, default_value = "./", default_value = "gcc", value_name = "COMPILER")]
83 compiler: String,
84 #[arg(long, default_value = "./", default_value = "ar", value_name = "ARCHIVER")]
85 archiver: String,
86 #[clap(short, long, value_parser, num_args = 0.., value_delimiter = ' ')]
87 compiler_flags: Vec<String>,
88 #[clap(short, long, value_parser, num_args = 0.., value_delimiter = ' ')]
89 linker_flags: Vec<String>,
90 }
91}
92
93#[derive(Parser, Debug, Clone)]
94pub struct BuildArgs {
95 #[arg(default_value = "./", value_name = "PATH")]
96 pub path: PathBuf,
97
98 #[command(subcommand)]
99 pub toolchain: Option<BuildToolchain>,
100
101 #[arg(long, value_enum, default_value = "executable", value_name = "LINK_STRATEGY",)]
103 pub link: LinkStrategy,
104
105 #[arg(long, group = "build_mode")]
107 pub release: bool,
108
109 #[arg(long, group = "build_mode")]
111 pub dev: bool,
112}
113impl BuildArgs {
114 pub fn build_mode(&self) -> BuildModeCli {
115 match (self.release, self.dev) {
116 (true, false) => BuildModeCli::Release,
117 (false, true) => BuildModeCli::Development,
118 _ => BuildModeCli::Development
119 }
120 }
121}
122
123
124#[derive(Subcommand, Debug, Clone)]
125pub enum CommandCli {
126 Clone(CloneArgs),
128 Init(InitArgs),
130 Clean(CleanArgs),
132 Build(BuildArgs),
134 Run(BuildArgs),
136 Compdb(CompilationDatabaseArgs),
138}
139
140#[derive(Parser, Debug, Clone)]
141#[command(version, about, long_about = None)]
142pub struct CLI {
143 #[command(subcommand)]
144 pub command: CommandCli,
145}