harlaw 1.1.1

Transform DSL files to JSON. Formatting options available for custom output.
Documentation
use std::fs::File;
use std::io::{self, BufRead};
use std::path::Path;

fn is_dsl_file(filename: &str) -> bool {
    Path::new(&filename).extension().unwrap().eq("dsl")
}

fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
where P: AsRef<Path>, {
    let file = File::open(filename)?;
    Ok(io::BufReader::new(file).lines())
}

pub fn read_dsl_file(filename: &str) -> Result<Vec<String>, &'static str> {
    if is_dsl_file(filename) {
        return match read_lines(&filename) {
            Ok(line_results) => {
                let mut lines = vec![];
                for line_result in line_results {
                   lines.push(line_result.unwrap_or_else(|_| String::from("Could not read all DSL lines")));
                }

                Ok(lines)
            }, 
            Err(_e) => Err("Could not read the given DSL file"),
        }
    }

    Err("Given file was not a DSL file")
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn recognizes_dsl_files() {
        let filename1 = "foo.dsl";
        let filename2 = "bar.dsl";
        let filename3 = "foo.json";
        let filename4 = "virus.exe";

        let result1 = is_dsl_file(&filename1);
        let result2 = is_dsl_file(&filename2);
        let result3 = is_dsl_file(&filename3);
        let result4 = is_dsl_file(&filename4);

        assert_eq!(result1, true);
        assert_eq!(result2, true);
        assert_eq!(result3, false);
        assert_eq!(result4, false);
    }

    #[test]
    fn errors_on_non_dsl_files() {
        let filename = "undefined.json";

        let result = read_dsl_file(filename);

        assert_eq!(result, Err("Given file was not a DSL file"));
    }

    #[test]
    fn errors_on_invalid_dsl_files() {
        let filename = "undefined.dsl";

        let result = read_dsl_file(filename);

        assert_eq!(result, Err("Could not read the given DSL file"));
    }

    #[test]
    fn reads_dsl_file() {
        let filename = "src/reader/fixtures/dummy.dsl";

        let result = read_dsl_file(filename).unwrap();

        assert_eq!(result[0], "#NAME	\"Test Dictionary fixture\"");
        assert_eq!(result[1], "#INDEX_LANGUAGE	\"English\"");
        assert_eq!(result[2], "#CONTENTS_LANGUAGE\t\"Latin\"");
        assert_eq!(result[3], "foo");
        assert_eq!(result[4], "	[m1]Lorem ipsum dolor sit amet, dolor sit igitur[/m]");
    }
}