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
//! Misc utils

use std::cmp::Ordering;
use std::path::Path;
use std::process::{Command, Stdio};

/// Executes a shell command
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()
}

/// Compares two vectors
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]));
    }
}