Skip to content

Commit 0a80e4f

Browse files
committed
cli + config: implement values override
1 parent b0949b8 commit 0a80e4f

File tree

4 files changed

+102
-46
lines changed

4 files changed

+102
-46
lines changed

src/cli.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,19 @@ pub struct InfoCliOptions {
5656
value_enum,
5757
value_name = "FIELD"
5858
)]
59-
pub disabled_fields: Vec<InfoType>,
59+
pub disabled_fields: Option<Vec<InfoType>>,
6060
/// Hides the title
6161
#[arg(long)]
62-
pub no_title: bool,
62+
pub no_title: Option<bool>,
6363
/// Maximum NUM of authors to be shown
64-
#[arg(long, default_value_t = 3usize, value_name = "NUM")]
65-
pub number_of_authors: usize,
64+
#[arg(long, value_name = "NUM")]
65+
pub number_of_authors: Option<usize>,
6666
/// Maximum NUM of languages to be shown
67-
#[arg(long, default_value_t = 6usize, value_name = "NUM")]
68-
pub number_of_languages: usize,
67+
#[arg(long, value_name = "NUM")]
68+
pub number_of_languages: Option<usize>,
6969
/// Maximum NUM of file churns to be shown
70-
#[arg(long, default_value_t = 3usize, value_name = "NUM")]
71-
pub number_of_file_churns: usize,
70+
#[arg(long, value_name = "NUM")]
71+
pub number_of_file_churns: Option<usize>,
7272
/// Minimum NUM of commits from HEAD used to compute the churn summary
7373
///
7474
/// By default, the actual value is non-deterministic due to time-based computation
@@ -89,7 +89,7 @@ pub struct InfoCliOptions {
8989
pub no_bots: Option<MyRegex>,
9090
/// Ignores merge commits
9191
#[arg(long)]
92-
pub no_merges: bool,
92+
pub no_merges: Option<bool>,
9393
/// Show the email address of each author
9494
#[arg(long, short = 'E')]
9595
pub email: bool,
@@ -101,7 +101,7 @@ pub struct InfoCliOptions {
101101
pub hide_token: bool,
102102
/// Count hidden files and directories
103103
#[arg(long)]
104-
pub include_hidden: bool,
104+
pub include_hidden: Option<bool>,
105105
/// Filters output by language type
106106
#[arg(
107107
long,
@@ -147,7 +147,7 @@ pub struct AsciiCliOptions {
147147
///
148148
/// If set to auto: true color will be enabled if supported by the terminal
149149
#[arg(long, default_value = "auto", value_name = "WHEN", value_enum)]
150-
pub true_color: When,
150+
pub true_color: Option<When>,
151151
}
152152

153153
#[derive(Clone, Debug, Args, PartialEq, Eq)]
@@ -191,13 +191,13 @@ pub struct TextFormattingCliOptions {
191191
pub text_colors: Vec<u8>,
192192
/// Use ISO 8601 formatted timestamps
193193
#[arg(long, short = 'z')]
194-
pub iso_time: bool,
194+
pub iso_time: Option<bool>,
195195
/// Which thousands SEPARATOR to use
196-
#[arg(long, value_name = "SEPARATOR", default_value = "plain", value_enum)]
197-
pub number_separator: NumberSeparator,
196+
#[arg(long, value_name = "SEPARATOR", value_enum)]
197+
pub number_separator: Option<NumberSeparator>,
198198
/// Turns off bold formatting
199199
#[arg(long)]
200-
pub no_bold: bool,
200+
pub no_bold: Option<bool>,
201201
}
202202
#[derive(Clone, Debug, Args, PartialEq, Eq, Default)]
203203
#[command(next_help_heading = "VISUALS")]
@@ -212,7 +212,7 @@ pub struct VisualsCliOptions {
212212
///
213213
/// Replaces language chips with Nerd Font icons
214214
#[arg(long)]
215-
pub nerd_fonts: bool,
215+
pub nerd_fonts: Option<bool>,
216216
}
217217

218218
#[derive(Clone, Debug, Args, PartialEq, Eq)]
@@ -268,9 +268,9 @@ impl Default for CliOptions {
268268
impl Default for InfoCliOptions {
269269
fn default() -> Self {
270270
InfoCliOptions {
271-
number_of_authors: 3,
272-
number_of_languages: 6,
273-
number_of_file_churns: 3,
271+
number_of_authors: Some(3),
272+
number_of_languages: Some(6),
273+
number_of_file_churns: Some(3),
274274
churn_pool_size: Option::default(),
275275
exclude: Vec::default(),
276276
no_bots: Option::default(),
@@ -280,7 +280,7 @@ impl Default for InfoCliOptions {
280280
hide_token: Default::default(),
281281
include_hidden: Default::default(),
282282
r#type: vec![LanguageType::Programming, LanguageType::Markup],
283-
disabled_fields: Vec::default(),
283+
disabled_fields: Some(Vec::default()),
284284
no_title: Default::default(),
285285
}
286286
}
@@ -291,7 +291,7 @@ impl Default for TextFormattingCliOptions {
291291
TextFormattingCliOptions {
292292
text_colors: Default::default(),
293293
iso_time: Default::default(),
294-
number_separator: NumberSeparator::Plain,
294+
number_separator: Some(NumberSeparator::Plain),
295295
no_bold: Default::default(),
296296
}
297297
}
@@ -303,7 +303,7 @@ impl Default for AsciiCliOptions {
303303
ascii_input: Option::default(),
304304
ascii_colors: Vec::default(),
305305
ascii_language: Option::default(),
306-
true_color: When::Auto,
306+
true_color: Some(When::Auto),
307307
}
308308
}
309309
}
@@ -418,8 +418,8 @@ mod test {
418418
input: PathBuf::from("/tmp/folder"),
419419
info: InfoCliOptions {
420420
number_of_authors: 4,
421-
no_merges: true,
422-
disabled_fields: vec![InfoType::Version, InfoType::URL],
421+
no_merges: Some(true),
422+
disabled_fields: vec![InfoType::Version, InfoType::URL].into(),
423423
..Default::default()
424424
},
425425
ascii: AsciiCliOptions {

src/info/mod.rs

Lines changed: 66 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use self::url::UrlInfo;
2222
use self::utils::info_field::{InfoField, InfoType};
2323
use self::version::VersionInfo;
2424
use crate::cli::{is_truecolor_terminal, CliOptions, NumberSeparator, When};
25+
use crate::config::ConfigOptions;
2526
use crate::ui::get_ascii_colors;
2627
use crate::ui::text_colors::TextColors;
2728
use anyhow::{Context, Result};
@@ -109,7 +110,7 @@ impl std::fmt::Display for Info {
109110
}
110111
}
111112

112-
pub fn build_info(cli_options: &CliOptions) -> Result<Info> {
113+
pub fn build_info(cli_options: &CliOptions, config_options: &ConfigOptions) -> Result<Info> {
113114
let mut repo = gix::ThreadSafeRepository::discover_opts(
114115
&cli_options.input,
115116
gix::discover::upwards::Options {
@@ -126,7 +127,10 @@ pub fn build_info(cli_options: &CliOptions) -> Result<Info> {
126127
let loc_by_language_sorted_handle = std::thread::spawn({
127128
let globs_to_exclude = cli_options.info.exclude.clone();
128129
let language_types = cli_options.info.r#type.clone();
129-
let include_hidden = cli_options.info.include_hidden;
130+
let include_hidden = cli_options
131+
.info
132+
.include_hidden
133+
.unwrap_or(config_options.include_hidden);
130134
let workdir = repo_path.clone();
131135
move || {
132136
langs::get_loc_by_language_sorted(
@@ -153,9 +157,17 @@ pub fn build_info(cli_options: &CliOptions) -> Result<Info> {
153157
&repo,
154158
cli_options.info.no_bots.clone(),
155159
cli_options.info.churn_pool_size,
156-
cli_options.info.no_merges,
160+
cli_options
161+
.info
162+
.no_merges
163+
.unwrap_or(config_options.no_merges),
157164
)?;
158-
let true_color = match cli_options.ascii.true_color {
165+
let true_color = match cli_options
166+
.ascii
167+
.true_color
168+
.clone()
169+
.unwrap_or(config_options.true_color.clone())
170+
{
159171
When::Always => true,
160172
When::Never => false,
161173
When::Auto => is_truecolor_terminal(),
@@ -169,16 +181,39 @@ pub fn build_info(cli_options: &CliOptions) -> Result<Info> {
169181
);
170182

171183
let text_colors = TextColors::new(&cli_options.text_formatting.text_colors, ascii_colors[0]);
172-
let no_bold = cli_options.text_formatting.no_bold;
173-
let number_separator = cli_options.text_formatting.number_separator;
174-
let iso_time = cli_options.text_formatting.iso_time;
175-
let number_of_languages_to_display = cli_options.info.number_of_languages;
176-
let number_of_authors_to_display = cli_options.info.number_of_authors;
177-
let number_of_file_churns_to_display = cli_options.info.number_of_file_churns;
184+
let no_bold = cli_options
185+
.text_formatting
186+
.no_bold
187+
.unwrap_or(config_options.no_bold);
188+
let number_separator = cli_options
189+
.text_formatting
190+
.number_separator
191+
.unwrap_or(config_options.number_separator);
192+
let iso_time = cli_options
193+
.text_formatting
194+
.iso_time
195+
.unwrap_or(config_options.iso_time);
196+
let number_of_languages_to_display = cli_options
197+
.info
198+
.number_of_languages
199+
.unwrap_or(config_options.number_of_languages);
200+
// This looks weird i think i should refactor unwrapping
201+
let number_of_authors_to_display = cli_options
202+
.info
203+
.number_of_authors
204+
.unwrap_or(config_options.number_of_authors);
205+
let number_of_file_churns_to_display = cli_options
206+
.info
207+
.number_of_file_churns
208+
.unwrap_or(config_options.number_of_file_churns);
178209
let globs_to_exclude = &cli_options.info.exclude;
179210
let show_email = cli_options.info.email;
211+
let nerd_fonts = cli_options
212+
.visuals
213+
.nerd_fonts
214+
.unwrap_or(config_options.nerd_fonts);
180215

181-
Ok(InfoBuilder::new(cli_options)
216+
Ok(InfoBuilder::new(cli_options, config_options)
182217
.title(&repo, no_bold, &text_colors)
183218
.project(&repo, &repo_url, manifest.as_ref(), number_separator)?
184219
.description(manifest.as_ref())
@@ -191,7 +226,7 @@ pub fn build_info(cli_options: &CliOptions) -> Result<Info> {
191226
true_color,
192227
number_of_languages_to_display,
193228
&text_colors,
194-
cli_options,
229+
nerd_fonts,
195230
)
196231
.dependencies(manifest.as_ref(), number_separator)
197232
.authors(
@@ -213,16 +248,26 @@ pub fn build_info(cli_options: &CliOptions) -> Result<Info> {
213248
.loc(&loc_by_language, number_separator)
214249
.size(&repo, number_separator)
215250
.license(&repo_path, manifest.as_ref())?
216-
.build(cli_options, text_colors, dominant_language, ascii_colors))
251+
.build(
252+
cli_options,
253+
no_bold,
254+
text_colors,
255+
dominant_language,
256+
ascii_colors,
257+
))
217258
}
218259

219260
impl InfoBuilder {
220-
fn new(cli_options: &CliOptions) -> Self {
261+
fn new(cli_options: &CliOptions, config_options: &ConfigOptions) -> Self {
221262
Self {
222263
title: None,
223264
info_fields: Vec::new(),
224-
disabled_fields: cli_options.info.disabled_fields.clone(),
225-
no_title: cli_options.info.no_title,
265+
disabled_fields: cli_options
266+
.info
267+
.disabled_fields
268+
.clone()
269+
.unwrap_or(config_options.disabled_fields.clone()),
270+
no_title: cli_options.info.no_title.unwrap_or(config_options.no_title),
226271
}
227272
}
228273

@@ -324,15 +369,15 @@ impl InfoBuilder {
324369
true_color: bool,
325370
number_of_languages: usize,
326371
text_colors: &TextColors,
327-
cli_options: &CliOptions,
372+
nerd_fonts: bool,
328373
) -> Self {
329374
if !self.disabled_fields.contains(&InfoType::Languages) {
330375
let languages = LanguagesInfo::new(
331376
loc_by_language,
332377
true_color,
333378
number_of_languages,
334379
text_colors.info,
335-
cli_options.visuals.nerd_fonts,
380+
nerd_fonts,
336381
);
337382
self.info_fields.push(Box::new(languages));
338383
}
@@ -444,6 +489,7 @@ impl InfoBuilder {
444489
fn build(
445490
self,
446491
cli_options: &CliOptions,
492+
no_bold: bool,
447493
text_colors: TextColors,
448494
dominant_language: Language,
449495
ascii_colors: Vec<DynColors>,
@@ -455,7 +501,7 @@ impl InfoBuilder {
455501
dominant_language,
456502
ascii_colors,
457503
no_color_palette: cli_options.visuals.no_color_palette,
458-
no_bold: cli_options.text_formatting.no_bold,
504+
no_bold: no_bold,
459505
}
460506
}
461507
}
@@ -472,7 +518,7 @@ fn get_manifest(repo_path: &Path) -> Result<Option<Manifest>> {
472518

473519
pub fn get_work_dir(repo: &gix::Repository) -> Result<std::path::PathBuf> {
474520
Ok(repo
475-
.work_dir()
521+
.workdir()
476522
.context("please run onefetch inside of a non-bare git repository")?
477523
.to_owned())
478524
}

src/info/utils/info_field.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ pub enum InfoType {
7575
LinesOfCode,
7676
Size,
7777
License,
78+
None,
7879
}
7980

8081
#[cfg(test)]

src/ui/printer.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::cli::CliOptions;
2+
use crate::config::ConfigOptions;
23
use crate::info::Info;
34
use crate::ui::Language;
45
use anyhow::{Context, Result};
@@ -30,7 +31,12 @@ pub struct Printer<W> {
3031
}
3132

3233
impl<W: Write> Printer<W> {
33-
pub fn new(writer: W, info: Info, cli_options: CliOptions) -> Result<Self> {
34+
pub fn new(
35+
writer: W,
36+
info: Info,
37+
cli_options: CliOptions,
38+
config_options: ConfigOptions,
39+
) -> Result<Self> {
3440
let image = match cli_options.image.image {
3541
Some(p) => Some(image::open(p).context("Could not load the specified image")?),
3642
None => None,
@@ -55,7 +61,10 @@ impl<W: Write> Printer<W> {
5561
image,
5662
image_backend,
5763
color_resolution: cli_options.image.color_resolution,
58-
no_bold: cli_options.text_formatting.no_bold,
64+
no_bold: cli_options
65+
.text_formatting
66+
.no_bold
67+
.unwrap_or(config_options.no_bold),
5968
ascii_input: cli_options.ascii.ascii_input,
6069
ascii_language: cli_options.ascii.ascii_language,
6170
})

0 commit comments

Comments
 (0)