1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
use std::cmp::Ordering;
use std::path::Path;
use std::process::{Command, Stdio};
pub fn exec_command(working_dir: &Path, cmd: &str, args: &[&str]) -> bool {
let mut cli_command = match Command::new(cmd)
.args(args)
.current_dir(working_dir)
.stdin(Stdio::inherit())
.stdout(Stdio::inherit())
.stderr(Stdio::inherit())
.spawn()
{
Err(err) => panic!("Error spawning: {}", err),
Ok(process) => process,
};
cli_command.wait().unwrap().success()
}
pub fn compare<T: Ord>(a: &[T], b: &[T]) -> Ordering {
let mut iter_b = b.iter();
for v in a {
match iter_b.next() {
Some(w) => match v.cmp(w) {
Ordering::Equal => continue,
ord => return ord,
},
None => break,
}
}
a.len().cmp(&b.len())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn compare_works_as_expected() {
assert_eq!(Ordering::Equal, compare(&[1, 2, 3], &[1, 2, 3]));
assert_eq!(Ordering::Less, compare(&[1, 0], &[1, 2]));
assert_eq!(Ordering::Less, compare(&[], &[1, 2, 3]));
assert_eq!(Ordering::Greater, compare(&[1, 2, 3], &[1, 2]));
assert_eq!(Ordering::Greater, compare(&[1, 3], &[1, 2]));
}
}