use itertools::Itertools;
use std::{
fs::File,
io::{BufRead, BufReader},
};
#[derive(Debug)]
pub struct MiniGrep {
path: String,
data: String,
}
impl MiniGrep {
pub fn new(path: &str) -> Self {
Self {
path: path.to_string(),
data: String::new(),
}
}
}
impl MiniGrep {
pub fn print(&self) {
println!("{}", self.data);
}
pub fn parse(&mut self, search: Option<&str>) -> anyhow::Result<()> {
let buff = BufReader::new(File::open(&self.path)?);
if let Some(arg) = search {
self.data = buff.lines().filter_ok(|str| str.contains(arg)).try_fold(
String::new(),
|mut acc, line| -> anyhow::Result<String> {
acc.push_str(&line?);
acc.push('\n');
Ok(acc)
},
)?;
self.data.pop();
} else {
self.data = buff.lines().try_fold(
String::new(),
|mut acc, line| -> anyhow::Result<String> {
acc.push_str(&line?);
acc.push('\n');
Ok(acc)
},
)?;
}
Ok(())
}
}
#[cfg(test)]
mod tests_minigrep_api {
use crate::*;
#[test]
fn test() -> anyhow::Result<()> {
let mut obj = MiniGrep::new(".test.txt");
assert_eq!(".test.txt", obj.path);
obj.parse(None)?;
assert_eq!("Yes\nNo\n", obj.data);
obj.parse(Some("Yes"))?;
assert_eq!("Yes", obj.data);
Ok(())
}
}