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
use std::fs::File;
use std::io::{ BufReader, BufWriter, Stdout, StdoutLock, self };
use std::io::prelude::*;
use anyhow::Result;

use assert_cmd::prelude::*;
use predicates::prelude::*;
use std::process::Command;

use tempfile::NamedTempFile;

pub fn find_matches(reader: BufReader<File>, pattern: &str) -> Result<()> {
    reader.lines()
        .map(|l| {
            l.unwrap()
        }) .filter(|line| {
            line.contains(pattern)
        }).for_each(|line| {
            let stdout: Stdout = io::stdout();
            let handle: StdoutLock = stdout.lock();
            let mut writer: BufWriter<StdoutLock> = BufWriter::new(handle);
            writeln!(writer, "{}", line).unwrap();
        });

    Ok(())
}

#[test]
fn find_a_match() -> Result<()>{
    let mut file = NamedTempFile::new()?;
    writeln!(file, "A test\nActual content\nMore content\nAnother test\n")?;

    let mut cmd = Command::cargo_bin("grrs")?;
    cmd.arg("test").arg(file.path());
    cmd.assert()
        .success()
        .stdout(predicate::str::contains("test\nAnother test"));
    Ok(())
}