1use std::fs::File;
27use std::fs::OpenOptions;
28use std::io::{self, BufRead, Write};
29use std::path::Path;
30
31pub fn read_lines<P>(filename: P) -> io::Result<Vec<String>> where P: AsRef<Path>, {
35 let file: File = File::open(filename)?;
36 let reader = io::BufReader::new(file).lines();
37 let mut lines: Vec<String> = Vec::new();
38 for line in reader {
39 if let Ok(line) = line {
40 lines.push(line);
41 }
42 }
43 Ok(lines)
44}
45
46pub fn write_lines<P>(filename: P, lines: Vec<String>) -> io::Result<()> where P: AsRef<Path> {
50 match OpenOptions::new().create(true).write(true).append(false).truncate(true).open(filename) {
51 Ok(mut f) => {
52 for line in lines.iter() {
53 writeln!(f, "{}", line)?;
54 }
55 Ok(())
56 },
57 Err(err) => Err(err)
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::*;
64 use std::io::Write;
65
66 #[test]
67 fn test_utils_file_read_lines() {
68 let sample_file: tempfile::NamedTempFile = write_sample_file();
69 let res: io::Result<Vec<String>> = read_lines(sample_file.path());
70 assert!(res.is_ok());
71 let lines: Vec<String> = res.unwrap();
72 assert_eq!(lines.len(), 3);
73 assert_eq!(*lines.get(0).unwrap(), String::from("Lorem ipsum dolor sit amet, consectetur adipiscing elit."));
74 assert_eq!(*lines.get(1).unwrap(), String::from("Mauris ultricies consequat eros,"));
75 assert_eq!(*lines.get(2).unwrap(), String::from("nec scelerisque magna imperdiet metus."));
76 }
77
78 #[test]
79 fn test_utils_file_read_lines_no_file() {
80 assert!(read_lines(Path::new("/sample.file123123.txt")).is_err());
81 }
82
83 #[test]
84 fn test_utils_file_write_lines() {
85 let in_lines: Vec<String> = vec![String::from("row 1"), String::from("row 2"), String::from("row 3")];
86 let tmpfile: tempfile::NamedTempFile = tempfile::NamedTempFile::new().unwrap();
87 assert!(write_lines(tmpfile.path(), in_lines.clone()).is_ok());
88 let res: io::Result<Vec<String>> = read_lines(tmpfile.path());
90 assert!(res.is_ok());
91 let out_lines: Vec<String> = res.unwrap();
92 assert_eq!(in_lines, out_lines);
93 }
94
95 #[test]
96 fn test_utils_file_write_lines_error() {
97 let in_lines: Vec<String> = vec![String::from("row 1"), String::from("row 2"), String::from("row 3")];
98 assert!(write_lines(Path::new("/sample.file1231234.txt"), in_lines).is_err());
99 }
100
101 fn write_sample_file() -> tempfile::NamedTempFile {
104 let mut tmpfile: tempfile::NamedTempFile = tempfile::NamedTempFile::new().unwrap();
106 write!(
107 tmpfile,
108 "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\nMauris ultricies consequat eros,\nnec scelerisque magna imperdiet metus.\n"
109 )
110 .unwrap();
111 tmpfile
112 }
113}