1use std::error::Error;
2use std::fs::{self, File};
3use std::io::{BufRead, BufReader, Write};
4
5pub fn file_read(file_name: &str) -> Result<String, Box<dyn Error>> {
15 let content = fs::read_to_string(file_name)?;
16 Ok(content)
17}
18
19pub fn file_write(file_name: &str, content: &str) -> Result<(), Box<dyn Error>> {
30 let mut file = File::create(file_name)?;
31 file.write_all(content.as_bytes())?;
32 Ok(())
33}
34
35pub fn process_file_lines<F>(file_name: &str, mut f: F) -> Result<(), Box<dyn Error>>
56where
57 F: FnMut(&str),
58{
59 let file = File::open(file_name)?;
60 let reader = BufReader::new(file);
61
62 for line_result in reader.lines() {
63 let line = line_result?;
64 f(&line);
65 }
66
67 Ok(())
68}
69
70#[cfg(test)]
71mod tests {
72 use super::*;
73 use std::fs;
74 use std::io::Write;
75
76 #[test]
77 fn test_file_read_write() -> Result<(), Box<dyn Error>> {
78 let file_name = "test_file.txt";
79 let content_a = "HELLO WORLD!";
80
81 file_write(file_name, content_a)?;
82
83 let content_b = file_read(file_name)?;
84
85 assert_eq!(content_b, content_a);
86 fs::remove_file(file_name)?;
87 Ok(())
88 }
89
90 #[test]
91 fn test_process_file_lines() -> Result<(), Box<dyn Error>> {
92 let mut path = std::env::temp_dir();
93 path.push("test_file_lines.txt");
94 let content = "rust\nruby\nr\n";
95 let mut file = File::create(&path)?;
96 file.write_all(content.as_bytes())?;
97
98 let mut collected = Vec::new();
99 process_file_lines(path.to_str().unwrap(), |line| {
100 let modified_line = line.replace("r", "R");
101 collected.push(modified_line);
102 })?;
103
104 assert_eq!(collected, vec!["Rust", "Ruby", "R"]);
105
106 fs::remove_file(path)?;
107 Ok(())
108 }
109}