Repository: starship/starship
File: src/modules/nim.rs (Rust)

Code before:
    if !is_nim_project {
        return None;
    }
    let nim_version_output = utils::exec_cmd("nim", &["--version"])?.stdout;
    let nim_version = parse_nim_version(&nim_version_output)?;

    let mut module = context.new_module("nim");
    let config = NimConfig::try_load(module.config);

    module.set_style(config.style);

    module.create_segment("symbol", &config.symbol);
    module.create_segment("version", &SegmentConfig::new(nim_version));

    Some(module)
}

fn parse_nim_version(version_cmd_output: &str) -> Option<&str> {
    Some(
        version_cmd_output
            .lines()
            // First line has the version
            .next()?
            .split(' ')
            .find(|&s| s.chars().all(|c| c >= '0' && c <= '9' || c == '.'))?,
    )
}

#[cfg(test)]
mod tests {
    use super::parse_nim_version;
    use crate::modules::utils::test::render_module;
    use ansi_term::Color;
    use std::fs::File;
    use std::io;

    #[test]
    fn nim_version() {
        let ok_versions = ["1.1.1", "2", "."];
        let not_ok_versions = ["abc", " \n.", ". ", "abc."];

        let all_some = ok_versions.iter().all(|&v| parse_nim_version(v).is_some());
        let all_none = not_ok_versions
            .iter()
            .any(|&v| parse_nim_version(v).is_some());

        assert_eq!(true, all_some);
        assert_eq!(true, all_none);

        let sample_nimc_output = "Nim Compiler Version 1.2.0 [Linux: amd64]
            Compiled at 2020-04-03

Review comment (suggestion):
Not sure if it matters but I think this can be simplified to:
```suggestion
    version_cmd_output
        .lines()
        // First line has the version
        .next()?
        .split(' ')
        .find(|&s| s.chars().all(|c| c >= '0' && c <= '9' || c == '.'))
```

Code after:
    if !is_nim_project {
        return None;
    }

    let nim_version_output = utils::exec_cmd("nim", &["--version"])?.stdout;
    let formatted_nim_version = format!("v{}", parse_nim_version(&nim_version_output)?);

    let mut module = context.new_module("nim");
    let config = NimConfig::try_load(module.config);

    module.set_style(config.style);

    module.create_segment("symbol", &config.symbol);
    module.create_segment("version", &SegmentConfig::new(&formatted_nim_version));

    Some(module)
}

fn parse_nim_version(version_cmd_output: &str) -> Option<&str> {
    version_cmd_output
        .lines()
        // First line has the version
        .next()?
        .split(' ')
        .find(|&s| s.chars().all(|c| c >= '0' && c <= '9' || c == '.'))
}

#[cfg(test)]
mod tests {
    use super::parse_nim_version;
    use crate::modules::utils::test::render_module;
    use ansi_term::Color;
    use std::fs::File;
    use std::io;

    #[test]
    fn nim_version() {
        let ok_versions = ["1.1.1", "2", "."];
        let not_ok_versions = ["abc", " \n.", ". ", "abc."];

        let all_some = ok_versions.iter().all(|&v| parse_nim_version(v).is_some());
        let all_none = not_ok_versions
            .iter()
            .any(|&v| parse_nim_version(v).is_some());

        assert_eq!(true, all_some);
        assert_eq!(true, all_none);

        let sample_nimc_output = "Nim Compiler Version 1.2.0 [Linux: amd64]
            Compiled at 2020-04-03
            Copyright (c) 2006-2020 by Andreas Rumpf