From 159b2ccede0d5559fe3ff9681ccfff314e608b35 Mon Sep 17 00:00:00 2001 From: Nadrieril Date: Fri, 20 Mar 2020 11:09:51 +0000 Subject: Parse RFC3986 URLs --- dhall/src/syntax/text/dhall.pest.visibility | 2 ++ dhall/src/syntax/text/parser.rs | 22 ++++++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) (limited to 'dhall/src') diff --git a/dhall/src/syntax/text/dhall.pest.visibility b/dhall/src/syntax/text/dhall.pest.visibility index 2a89076..b2114ce 100644 --- a/dhall/src/syntax/text/dhall.pest.visibility +++ b/dhall/src/syntax/text/dhall.pest.visibility @@ -120,6 +120,7 @@ home_path absolute_path scheme http_raw +url_path authority # userinfo # host @@ -133,6 +134,7 @@ authority # dec_octet # domain # domainlabel +segment # pchar query # pct_encoded diff --git a/dhall/src/syntax/text/parser.rs b/dhall/src/syntax/text/parser.rs index 5686300..03211c7 100644 --- a/dhall/src/syntax/text/parser.rs +++ b/dhall/src/syntax/text/parser.rs @@ -551,14 +551,14 @@ impl DhallParser { fn http_raw(input: ParseInput) -> ParseResult> { Ok(match_nodes!(input.into_children(); - [scheme(sch), authority(auth), path(p)] => URL { + [scheme(sch), authority(auth), url_path(p)] => URL { scheme: sch, authority: auth, path: p, query: None, headers: None, }, - [scheme(sch), authority(auth), path(p), query(q)] => URL { + [scheme(sch), authority(auth), url_path(p), query(q)] => URL { scheme: sch, authority: auth, path: p, @@ -568,10 +568,28 @@ impl DhallParser { )) } + fn url_path(input: ParseInput) -> ParseResult { + Ok(match_nodes!(input.into_children(); + [path_component(components)..] => { + let mut file_path: Vec<_> = components.collect(); + // An empty path normalizes to "/" + if file_path.is_empty() { + file_path = vec!["".to_owned()]; + } + FilePath { file_path } + } + )) + } + fn authority(input: ParseInput) -> ParseResult { Ok(input.as_str().to_owned()) } + #[alias(path_component)] + fn segment(input: ParseInput) -> ParseResult { + Ok(input.as_str().to_string()) + } + fn query(input: ParseInput) -> ParseResult { Ok(input.as_str().to_owned()) } -- cgit v1.2.3