pyc_shell/utils/
file.rs

1//! ## File
2//!
3//! `File` module implements some utilities related to files
4
5/*
6*
7*   Copyright (C) 2020 Christian Visintin - christian.visintin1997@gmail.com
8*
9* 	This file is part of "Pyc"
10*
11*   Pyc is free software: you can redistribute it and/or modify
12*   it under the terms of the GNU General Public License as published by
13*   the Free Software Foundation, either version 3 of the License, or
14*   (at your option) any later version.
15*
16*   Pyc is distributed in the hope that it will be useful,
17*   but WITHOUT ANY WARRANTY; without even the implied warranty of
18*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19*   GNU General Public License for more details.
20*
21*   You should have received a copy of the GNU General Public License
22*   along with Pyc.  If not, see <http://www.gnu.org/licenses/>.
23*
24*/
25
26use std::fs::File;
27use std::fs::OpenOptions;
28use std::io::{self, BufRead, Write};
29use std::path::Path;
30
31/// ### read_lines
32/// 
33/// Read lines from file
34pub 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
46/// ### write_lines
47/// 
48/// Write lines to file
49pub 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        //Verify rows
89        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    /// ### write_sample_file
102    /// Write a sample file
103    fn write_sample_file() -> tempfile::NamedTempFile {
104        // Write
105        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}