Skip to content
Snippets Groups Projects
arg_value.rs 1.83 KiB
Newer Older
Lennard Gäher's avatar
Lennard Gäher committed
// Copyright 2014-2020 The Rust Project Developers
//
// Licensed under the Apache License, Version 2.0<LICENSE-APACHE or
// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
// https://opensource.org/licenses/MIT>, at your option. Files in the project may not be copied,
// modified, or distributed except according to those terms.

/// Source: <https://github.com/rust-lang/rust-clippy/blob/master/src/driver.rs>
Lennard Gäher's avatar
Lennard Gäher committed
use std::ops::Deref;

/// If a command-line option matches `find_arg`, then apply the predicate `pred` on its value. If
/// true, then return it. The parameter is assumed to be either `--arg=value` or `--arg value`.
pub fn arg_value<'a, T: Deref<Target = str>, F: Fn(&str) -> bool>(
Lennard Gäher's avatar
Lennard Gäher committed
    args: &'a [T],
    find_arg: &str,
Lennard Gäher's avatar
Lennard Gäher committed
) -> Option<&'a str> {
    let mut args = args.iter().map(Deref::deref);
    while let Some(arg) = args.next() {
        let mut arg = arg.splitn(2, '=');
        if arg.next() != Some(find_arg) {
            continue;
        }

        match arg.next().or_else(|| args.next()) {
            Some(v) if pred(v) => return Some(v),
Lennard Gäher's avatar
Lennard Gäher committed
            _ => {},
#[cfg(test)]
mod tests {
    use super::*;
    #[test]
    fn test_arg_value() {
        let args = &["--bar=bar", "--foobar", "123", "--foo"];

        assert_eq!(arg_value(&[] as &[&str], "--foobar", |_| true), None);
        assert_eq!(arg_value(args, "--bar", |_| false), None);
        assert_eq!(arg_value(args, "--bar", |_| true), Some("bar"));
        assert_eq!(arg_value(args, "--bar", |p| p == "bar"), Some("bar"));
        assert_eq!(arg_value(args, "--bar", |p| p == "foo"), None);
        assert_eq!(arg_value(args, "--foobar", |p| p == "foo"), None);
        assert_eq!(arg_value(args, "--foobar", |p| p == "123"), Some("123"));
        assert_eq!(arg_value(args, "--foo", |_| true), None);
    }
Lennard Gäher's avatar
Lennard Gäher committed
}