summaryrefslogtreecommitdiff
path: root/dhall_syntax/src/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'dhall_syntax/src/parser.rs')
-rw-r--r--dhall_syntax/src/parser.rs41
1 files changed, 28 insertions, 13 deletions
diff --git a/dhall_syntax/src/parser.rs b/dhall_syntax/src/parser.rs
index 9d9a374..7675622 100644
--- a/dhall_syntax/src/parser.rs
+++ b/dhall_syntax/src/parser.rs
@@ -146,6 +146,14 @@ fn debug_pair(pair: Pair<Rule>) -> String {
s
}
+fn to_file(path: Vec<String>) -> Result<File, String> {
+ let mut path = path;
+ let file_name: Option<String> = path.pop();
+ let file = file_name.ok_or("Empty file path was provided")?;
+ let directory = Directory { components: path };
+ Ok(File { directory: directory, file: file })
+}
+
macro_rules! make_parser {
(@pattern, rule, $name:ident) => (Rule::$name);
(@pattern, token_rule, $name:ident) => (Rule::$name);
@@ -589,19 +597,25 @@ make_parser! {
});
rule!(http_raw<URL>; children!(
- [scheme(sch), authority(auth), path(p)] => URL {
- scheme: sch,
- authority: auth,
- path: p,
- query: None,
- headers: None,
+ [scheme(sch), authority(auth), path(p)] => {
+ let file = to_file(p)?;
+ URL {
+ scheme: sch,
+ authority: auth,
+ path: file,
+ query: None,
+ headers: None,
+ }
},
- [scheme(sch), authority(auth), path(p), query(q)] => URL {
- scheme: sch,
- authority: auth,
- path: p,
- query: Some(q),
- headers: None,
+ [scheme(sch), authority(auth), path(p), query(q)] => {
+ let file = to_file(p)?;
+ URL {
+ scheme: sch,
+ authority: auth,
+ path: file,
+ query: Some(q),
+ headers: None,
+ }
},
));
@@ -655,7 +669,8 @@ make_parser! {
ImportLocation::Remote(url)
},
[local((prefix, p))] => {
- ImportLocation::Local(prefix, p)
+ let file = to_file(p)?;
+ ImportLocation::Local(prefix, file)
},
));