Skip to content

Commit 6ee1b28

Browse files
Try to pimp divsuftest a little
1 parent fadb12c commit 6ee1b28

File tree

3 files changed

+102
-18
lines changed

3 files changed

+102
-18
lines changed

Diff for: Cargo.lock

+42
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: crates/divsuftest/Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,5 @@ suffix_array = "0.4.0"
1414
better-panic = "0.2.0"
1515
size_format = "1.0.2"
1616
cli-table = "0.2.0"
17+
pico-args = "0.3.0"
18+
failure = "0.1.6"

Diff for: crates/divsuftest/src/main.rs

+58-18
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,55 @@
1+
use failure::Fallible;
12
use size_format::SizeFormatterBinary;
23
use std::{env, io::Write, process, time::Instant};
34

4-
fn main() {
5-
better_panic::install();
5+
struct Args {
6+
partitions: u32,
7+
free: Vec<String>,
8+
}
69

7-
let all_args: Vec<String> = env::args().collect();
8-
let args = &all_args[1..];
10+
enum Command {
11+
Crosscheck,
12+
Bench,
13+
Run,
14+
}
915

10-
if args.len() == 0 {
11-
println!("Usage: divsuftest bench|crosscheck INPUT [LENGTH]");
12-
process::exit(1);
16+
impl Command {
17+
fn parse(s: &str) -> Option<Self> {
18+
match s {
19+
"crosscheck" => Some(Self::Crosscheck),
20+
"bench" => Some(Self::Bench),
21+
"run" => Some(Self::Run),
22+
_ => None,
23+
}
1324
}
25+
}
1426

15-
let (cmd, args) = (&args[0], &args[1..]);
27+
fn main() -> Fallible<()> {
28+
better_panic::install();
1629

17-
let input_path = args.get(0).expect("INPUT argument expected");
30+
let mut args = pico_args::Arguments::from_env();
31+
let args = Args {
32+
partitions: args.opt_value_from_str("--partitions")?.unwrap_or(1),
33+
free: args.free()?,
34+
};
35+
36+
if args.free.is_empty() {
37+
usage();
38+
}
39+
let cmd = Command::parse(&args.free.get(0).unwrap_or_else(|| {
40+
usage();
41+
unreachable!();
42+
}))
43+
.expect("Command should be one of crosscheck bench or run");
44+
45+
let input_path = args.free.get(1).unwrap_or_else(|| {
46+
usage();
47+
unreachable!();
48+
});
1849
let input_full = std::fs::read(input_path).unwrap();
1950
let len = args
20-
.get(1)
51+
.free
52+
.get(2)
2153
.map(parse_size)
2254
.unwrap_or_else(|| input_full.len());
2355
let input = &input_full[..len];
@@ -26,8 +58,8 @@ fn main() {
2658
SizeFormatterBinary::new(input.len() as u64)
2759
);
2860

29-
match cmd.as_ref() {
30-
"crosscheck" => {
61+
match cmd {
62+
Command::Crosscheck => {
3163
#[cfg(not(feature = "crosscheck"))]
3264
{
3365
println!(
@@ -38,12 +70,17 @@ fn main() {
3870
}
3971

4072
#[cfg(feature = "crosscheck")]
41-
command_crosscheck(input);
73+
command_crosscheck(input)?;
4274
}
43-
"bench" => command_bench(input),
44-
"run" => command_run(input),
45-
x => panic!("unknown command {:?}", x),
75+
Command::Bench => command_bench(input)?,
76+
Command::Run => command_run(input)?,
4677
}
78+
Ok(())
79+
}
80+
81+
fn usage() {
82+
println!("Usage: divsuftest bench|crosscheck|run INPUT [LENGTH]");
83+
process::exit(1);
4784
}
4885

4986
#[cfg(feature = "crosscheck")]
@@ -79,13 +116,15 @@ fn command_crosscheck(input: &[u8]) {
79116
};
80117
}
81118

82-
fn command_run(input: &[u8]) {
119+
fn command_run(input: &[u8]) -> Fallible<()> {
83120
let before = Instant::now();
84121
divsufsort::sort(input);
85122
println!("Done in {:?}", before.elapsed());
123+
124+
Ok(())
86125
}
87126

88-
fn command_bench(input: &[u8]) {
127+
fn command_bench(input: &[u8]) -> Fallible<()> {
89128
#[cfg(debug_assertions)]
90129
{
91130
println!("==========================================");
@@ -151,6 +190,7 @@ fn command_bench(input: &[u8]) {
151190

152191
Table::new(rows, Default::default()).print_stdout().unwrap();
153192
}
193+
Ok(())
154194
}
155195

156196
fn parse_size<I: AsRef<str>>(input: I) -> usize {

0 commit comments

Comments
 (0)