From d0978c35d88811462de5c448a24770f73b321e70 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Sun, 24 Mar 2019 21:05:01 +0100 Subject: Parse multiline strings correctly Closes #24 --- dhall/build.rs | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) (limited to 'dhall/build.rs') diff --git a/dhall/build.rs b/dhall/build.rs index c8ad6ad..cc62a97 100644 --- a/dhall/build.rs +++ b/dhall/build.rs @@ -1,23 +1,28 @@ use std::env; use std::ffi::OsString; -use std::fs::{self, File}; +use std::fs::File; use std::io::Write; use std::path::Path; +use walkdir::WalkDir; fn dhall_files_in_dir<'a>(dir: &'a Path) -> impl Iterator + 'a { - fs::read_dir(dir).unwrap().filter_map(move |path| { - let path = path.unwrap().path(); - let path = path.strip_prefix(dir).unwrap(); - if path.extension() != Some(&OsString::from("dhall")) { - return None; - } - let path = path.to_string_lossy(); - let path = path[..path.len() - 6].to_owned(); - Some(path) - }) + WalkDir::new(dir) + .into_iter() + .filter_map(|e| e.ok()) + .filter_map(move |path| { + let path = path.path(); + let path = path.strip_prefix(dir).unwrap(); + if path.extension() != Some(&OsString::from("dhall")) { + return None; + } + let path = path.to_string_lossy(); + let path = path[..path.len() - 6].to_owned(); + Some(path) + }) } fn main() -> std::io::Result<()> { + println!("cargo:rerun-if-changed=../dhall-lang/.git"); let out_dir = env::var("OUT_DIR").unwrap(); let tests_dir = Path::new("../dhall-lang/tests/"); @@ -25,17 +30,18 @@ fn main() -> std::io::Result<()> { let mut file = File::create(parser_tests_path)?; for path in dhall_files_in_dir(&tests_dir.join("parser/success/")) { - let name = &path[..path.len() - 1]; + let path = &path[..path.len() - 1]; + let name = path.replace("/", "_"); // Skip this test; parser is way too slow indebug mode if name == "largeExpression" { continue; } - writeln!(file, r#"make_spec_test!(ParserSuccess, spec_parser_success_{0}, "{0}");"#, name)?; + writeln!(file, r#"make_spec_test!(ParserSuccess, spec_parser_success_{}, "{}");"#, name, path)?; } for path in dhall_files_in_dir(&tests_dir.join("parser/failure/")) { - let name = &path; - writeln!(file, r#"make_spec_test!(ParserFailure, spec_parser_failure_{0}, "{0}");"#, name)?; + let name = path.replace("/", "_"); + writeln!(file, r#"make_spec_test!(ParserFailure, spec_parser_failure_{}, "{}");"#, name, path)?; } Ok(()) -- cgit v1.2.3