use crate::config::LinkStrategy;
use clap::{Parser, Subcommand};
use std::fmt::Display;
use std::path::PathBuf;
#[derive(Debug, Default, Clone)]
pub enum BuildModeCli {
#[default]
Development,
Release,
}
impl Display for BuildModeCli {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let str = match self {
BuildModeCli::Release => "release".to_string(),
BuildModeCli::Development => "development".to_string(),
};
write!(f, "{}", str)
}
}
#[derive(Parser, Debug, Clone)]
pub struct InitArgs {
#[arg(default_value = "./", value_name = "PATH")]
pub path: PathBuf,
#[arg(long, default_value = "false", value_name = "NO_GIT")]
pub no_git: bool,
}
#[derive(Parser, Debug, Clone)]
pub struct CleanArgs {
#[arg(default_value = "./", value_name = "PATH")]
pub path: PathBuf,
#[arg(long)]
pub deps_too: bool,
}
#[derive(Subcommand, Debug, Clone)]
pub enum CloneSource {
Git {
#[arg(value_name = "URL")]
url: String,
#[arg(long, default_value = "master", value_name = "BRANCH")]
branch: String,
},
FileSystem {
#[arg(value_name = "PATH")]
from: PathBuf,
},
}
#[derive(Parser, Debug, Clone)]
pub struct CloneArgs {
#[arg(default_value = "./", value_name = "PATH")]
pub path: PathBuf,
#[clap(subcommand)]
pub source: CloneSource,
}
#[derive(Parser, Debug, Clone)]
pub struct CompilationDatabaseArgs {
#[arg(default_value = "./", value_name = "PATH")]
pub path: PathBuf,
}
#[derive(Subcommand, Debug, Clone)]
pub enum BuildToolchain {
Default,
Named {
#[arg(value_name = "NAME")]
name: String,
},
Custom {
#[arg(long, default_value = "./", default_value = "gcc", value_name = "COMPILER")]
compiler: String,
#[arg(long, default_value = "./", default_value = "ar", value_name = "ARCHIVER")]
archiver: String,
#[clap(short, long, value_parser, num_args = 0.., value_delimiter = ' ')]
compiler_flags: Vec<String>,
#[clap(short, long, value_parser, num_args = 0.., value_delimiter = ' ')]
linker_flags: Vec<String>,
}
}
#[derive(Parser, Debug, Clone)]
pub struct BuildArgs {
#[arg(default_value = "./", value_name = "PATH")]
pub path: PathBuf,
#[command(subcommand)]
pub toolchain: Option<BuildToolchain>,
#[arg(long, value_enum, default_value = "executable", value_name = "LINK_STRATEGY",)]
pub link: LinkStrategy,
#[arg(long, group = "build_mode")]
pub release: bool,
#[arg(long, group = "build_mode")]
pub dev: bool,
}
impl BuildArgs {
pub fn build_mode(&self) -> BuildModeCli {
match (self.release, self.dev) {
(true, false) => BuildModeCli::Release,
(false, true) => BuildModeCli::Development,
_ => BuildModeCli::Development
}
}
}
#[derive(Subcommand, Debug, Clone)]
pub enum CommandCli {
Clone(CloneArgs),
Init(InitArgs),
Clean(CleanArgs),
Build(BuildArgs),
Run(BuildArgs),
Compdb(CompilationDatabaseArgs),
}
#[derive(Parser, Debug, Clone)]
#[command(version, about, long_about = None)]
pub struct CLI {
#[command(subcommand)]
pub command: CommandCli,
}