corge/
cli.rs

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    /// Initializes the project without a git repository.
28    #[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    /// Clean the dependencies directory too.
38    #[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    /// Selects the default toolchain.
74    Default,
75    /// Selects toolchain by name from the build.yaml file
76    Named {
77        #[arg(value_name = "NAME")]
78        name: String,
79    },
80    /// Selects a custom toolchain.
81    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    /// Specifies the link strategy.
102    #[arg(long, value_enum, default_value = "executable", value_name = "LINK_STRATEGY",)]
103    pub link: LinkStrategy,
104
105    /// Builds the project in release mode (optimized).
106    #[arg(long, group = "build_mode")]
107    pub release: bool,
108
109    /// Builds the project in development mode (debug info).
110    #[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 a project
127    Clone(CloneArgs),
128    /// Initializes a new project.
129    Init(InitArgs),
130    /// Cleans the project build directory and optionally dependencies directory.
131    Clean(CleanArgs),
132    /// Builds the project.
133    Build(BuildArgs),
134    /// Builds and runs the project.
135    Run(BuildArgs),
136    /// Generates a compile_commands.json for the project.
137    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}