Skip to content

Commit 2b9f425

Browse files
committedOct 10, 2020
further refactoring of main.rs
1 parent 71787c3 commit 2b9f425

File tree

4 files changed

+89
-75
lines changed

4 files changed

+89
-75
lines changed
 

Diff for: ‎src/app.rs renamed to ‎src/clap_app.rs

File renamed without changes.

Diff for: ‎src/image_backends/mod.rs

+27-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
use image::DynamicImage;
22

3-
#[cfg(target_os = "linux")]
3+
#[cfg(unix)]
44
pub mod kitty;
5-
#[cfg(target_os = "linux")]
5+
#[cfg(unix)]
66
pub mod sixel;
77

88
pub trait ImageBackend {
99
fn add_image(&self, lines: Vec<String>, image: &DynamicImage) -> String;
1010
}
1111

12-
#[cfg(target_os = "linux")]
12+
#[cfg(unix)]
1313
pub fn get_best_backend() -> Option<Box<dyn ImageBackend>> {
1414
if kitty::KittyBackend::supported() {
1515
Some(Box::new(kitty::KittyBackend::new()))
@@ -20,7 +20,30 @@ pub fn get_best_backend() -> Option<Box<dyn ImageBackend>> {
2020
}
2121
}
2222

23-
#[cfg(not(target_os = "linux"))]
23+
pub fn get_image_backend(
24+
image: &Option<DynamicImage>,
25+
backend_name: &str,
26+
) -> Option<Box<dyn ImageBackend>> {
27+
if image.is_some() {
28+
#[cfg(unix)]
29+
let backend = Some(match backend_name {
30+
"kitty" => {
31+
Box::new(kitty::KittyBackend::new()) as Box<dyn ImageBackend>
32+
}
33+
"sixel" => {
34+
Box::new(sixel::SixelBackend::new()) as Box<dyn ImageBackend>
35+
}
36+
_ => unreachable!(),
37+
});
38+
#[cfg(not(unix))]
39+
let backend = None;
40+
backend
41+
} else {
42+
None
43+
}
44+
}
45+
46+
#[cfg(not(unix))]
2447
pub fn get_best_backend() -> Option<Box<dyn ImageBackend>> {
2548
None
2649
}

Diff for: ‎src/info.rs

+32-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use {
88
colored::{Color, ColoredString, Colorize},
99
git2::Repository,
1010
regex::Regex,
11-
std::{ffi::OsStr, fmt::Write, fs},
11+
std::{ffi::OsStr, fmt::Write, fs, str::FromStr},
1212
strum::{EnumCount, EnumIter, EnumString, IntoStaticStr},
1313
tokio::process::Command,
1414
};
@@ -77,6 +77,37 @@ pub struct Info {
7777
config: Options,
7878
}
7979

80+
pub fn get_disabled_fields(fields_to_hide: Vec<String>) -> Result<InfoFieldOn> {
81+
let mut disabled_fields = InfoFieldOn {
82+
..Default::default()
83+
};
84+
85+
for field in fields_to_hide.iter() {
86+
let item = InfoFields::from_str(field.to_lowercase().as_str())
87+
.unwrap_or(InfoFields::UnrecognizedField);
88+
89+
match item {
90+
InfoFields::GitInfo => disabled_fields.git_info = true,
91+
InfoFields::Project => disabled_fields.project = true,
92+
InfoFields::HEAD => disabled_fields.head = true,
93+
InfoFields::Version => disabled_fields.version = true,
94+
InfoFields::Created => disabled_fields.created = true,
95+
InfoFields::Languages => disabled_fields.languages = true,
96+
InfoFields::Authors => disabled_fields.authors = true,
97+
InfoFields::LastChange => disabled_fields.last_change = true,
98+
InfoFields::Repo => disabled_fields.repo = true,
99+
InfoFields::Pending => disabled_fields.pending = true,
100+
InfoFields::Commits => disabled_fields.commits = true,
101+
InfoFields::LinesOfCode => disabled_fields.lines_of_code = true,
102+
InfoFields::Size => disabled_fields.size = true,
103+
InfoFields::License => disabled_fields.license = true,
104+
_ => (),
105+
}
106+
}
107+
108+
Ok(disabled_fields)
109+
}
110+
80111
impl std::fmt::Display for Info {
81112
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
82113
let mut buf = String::new();

Diff for: ‎src/main.rs

+30-70
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
#[macro_use]
22
extern crate clap;
33

4-
#[cfg(target_os = "linux")]
5-
use image_backends::ImageBackend;
4+
#[cfg(unix)]
65
use {
76
ascii_art::AsciiArt,
87
commit_info::CommitInfo,
98
error::Error,
109
exit_codes::ExitCode,
11-
info::{Info, InfoFieldOn, InfoFields},
10+
info::Info,
1211
language::Language,
1312
process::{Command, Stdio},
1413
std::{convert::From, env, process, result, str::FromStr},
1514
strum::IntoEnumIterator,
1615
};
1716

18-
mod app;
17+
mod clap_app;
1918
mod ascii_art;
2019
mod commit_info;
2120
mod error;
@@ -28,90 +27,38 @@ mod options;
2827

2928
type Result<T> = result::Result<T, Error>;
3029

31-
fn run() -> Result<()> {
32-
#[cfg(target_os = "windows")]
33-
let enabled = ansi_term::enable_ansi_support().is_ok();
34-
35-
#[cfg(not(target_os = "windows"))]
36-
let enabled = true;
37-
38-
if enabled {
39-
colored::control::set_override(true);
40-
}
30+
/// Returns `Err(..)` upon fatal errors. Otherwise, returns `Ok(true)` on full success and
31+
/// `Ok(false)` if any intermediate errors occurred (were printed).
32+
fn run() -> Result<bool> {
33+
#[cfg(windows)]
34+
let _ = ansi_term::enable_ansi_support();
4135

4236
if !is_git_installed() {
4337
return Err(Error::GitNotInstalled);
4438
}
4539

46-
let matches = app::build_app().get_matches_from(env::args_os());
40+
let matches = clap_app::build_app().get_matches_from(env::args_os());
4741

4842
if matches.is_present("languages") {
49-
let iterator = Language::iter().filter(|x| *x != Language::Unknown);
50-
51-
for l in iterator {
52-
println!("{}", l);
53-
}
54-
std::process::exit(0);
43+
return list_languages();
5544
}
5645

57-
let mut disabled_fields = InfoFieldOn {
58-
..Default::default()
59-
};
60-
6146
let fields_to_hide: Vec<String> = if let Some(values) = matches.values_of("disable-fields") {
6247
values.map(String::from).collect()
6348
} else {
6449
Vec::new()
6550
};
6651

67-
for field in fields_to_hide.iter() {
68-
let item = InfoFields::from_str(field.to_lowercase().as_str())
69-
.unwrap_or(InfoFields::UnrecognizedField);
70-
71-
match item {
72-
InfoFields::GitInfo => disabled_fields.git_info = true,
73-
InfoFields::Project => disabled_fields.project = true,
74-
InfoFields::HEAD => disabled_fields.head = true,
75-
InfoFields::Version => disabled_fields.version = true,
76-
InfoFields::Created => disabled_fields.created = true,
77-
InfoFields::Languages => disabled_fields.languages = true,
78-
InfoFields::Authors => disabled_fields.authors = true,
79-
InfoFields::LastChange => disabled_fields.last_change = true,
80-
InfoFields::Repo => disabled_fields.repo = true,
81-
InfoFields::Pending => disabled_fields.pending = true,
82-
InfoFields::Commits => disabled_fields.commits = true,
83-
InfoFields::LinesOfCode => disabled_fields.lines_of_code = true,
84-
InfoFields::Size => disabled_fields.size = true,
85-
InfoFields::License => disabled_fields.license = true,
86-
_ => (),
87-
}
88-
}
89-
9052
let image = if let Some(image_path) = matches.value_of("image") {
9153
Some(image::open(image_path).map_err(|_| Error::ImageLoadError)?)
9254
} else {
9355
None
9456
};
9557

96-
let image_backend = if image.is_some() {
97-
if let Some(backend_name) = matches.value_of("image-backend") {
98-
#[cfg(target_os = "linux")]
99-
let backend =
100-
Some(match backend_name {
101-
"kitty" => Box::new(image_backends::kitty::KittyBackend::new())
102-
as Box<dyn ImageBackend>,
103-
"sixel" => Box::new(image_backends::sixel::SixelBackend::new())
104-
as Box<dyn ImageBackend>,
105-
_ => unreachable!(),
106-
});
107-
#[cfg(not(target_os = "linux"))]
108-
let backend = None;
109-
backend
110-
} else {
111-
crate::image_backends::get_best_backend()
112-
}
58+
let image_backend = if let Some(backend_name) = matches.value_of("image-backend") {
59+
image_backends::get_image_backend(&image, backend_name)
11360
} else {
114-
None
61+
image_backends::get_best_backend()
11562
};
11663

11764
let config = options::Options {
@@ -126,9 +73,9 @@ fn run() -> Result<()> {
12673
} else {
12774
Vec::new()
12875
},
129-
disabled_fields,
76+
disabled_fields: info::get_disabled_fields(fields_to_hide)?,
13077
no_bold: !matches.is_present("no-bold"),
131-
image: image,
78+
image,
13279
image_backend,
13380
no_merges: matches.is_present("no-merge-commits"),
13481
no_color_blocks: matches.is_present("no-color-blocks"),
@@ -147,15 +94,28 @@ fn run() -> Result<()> {
14794
let info = Info::new(config)?;
14895

14996
print!("{}", info);
150-
Ok(())
97+
Ok(true)
98+
}
99+
100+
pub fn list_languages() -> Result<bool> {
101+
let iterator = Language::iter().filter(|x| *x != Language::Unknown);
102+
103+
for l in iterator {
104+
println!("{}", l);
105+
}
106+
107+
Ok(true)
151108
}
152109

153110
fn main() {
154111
let result = run();
155112
match result {
156-
Ok(_) => {
113+
Ok(true) => {
157114
process::exit(ExitCode::Success.into());
158115
}
116+
Ok(false) => {
117+
process::exit(ExitCode::GeneralError.into());
118+
}
159119
Err(_) => {
160120
process::exit(ExitCode::GeneralError.into());
161121
}

0 commit comments

Comments
 (0)
Please sign in to comment.