summaryrefslogtreecommitdiff
path: root/dhall_syntax/src
diff options
context:
space:
mode:
Diffstat (limited to 'dhall_syntax/src')
-rw-r--r--dhall_syntax/src/core/import.rs75
-rw-r--r--dhall_syntax/src/parser.rs14
2 files changed, 10 insertions, 79 deletions
diff --git a/dhall_syntax/src/core/import.rs b/dhall_syntax/src/core/import.rs
index ef696b9..cc38bb0 100644
--- a/dhall_syntax/src/core/import.rs
+++ b/dhall_syntax/src/core/import.rs
@@ -12,14 +12,14 @@ pub enum FilePrefix {
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
-pub struct File {
+pub struct FilePath {
pub file_path: Vec<String>,
}
/// The location of import (i.e. local vs. remote vs. environment)
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum ImportLocation<SubExpr> {
- Local(FilePrefix, File),
+ Local(FilePrefix, FilePath),
Remote(URL<SubExpr>),
Env(String),
Missing,
@@ -29,7 +29,7 @@ pub enum ImportLocation<SubExpr> {
pub struct URL<SubExpr> {
pub scheme: Scheme,
pub authority: String,
- pub path: File,
+ pub path: FilePath,
pub query: Option<String>,
pub headers: Option<SubExpr>,
}
@@ -104,72 +104,3 @@ impl<SE> Import<SE> {
})
}
}
-
-pub trait Canonicalize {
- fn canonicalize(&self) -> Self;
-}
-
-impl Canonicalize for File {
- fn canonicalize(&self) -> File {
- let mut file_path = Vec::new();
- let mut file_path_components = self.file_path.clone().into_iter();
-
- loop {
- let component = file_path_components.next();
- match component.as_ref() {
- // ───────────────────
- // canonicalize(ε) = ε
- None => break,
-
- // canonicalize(directory₀) = directory₁
- // ───────────────────────────────────────
- // canonicalize(directory₀/.) = directory₁
- Some(c) if c == "." => continue,
-
- Some(c) if c == ".." => match file_path_components.next() {
- // canonicalize(directory₀) = ε
- // ────────────────────────────
- // canonicalize(directory₀/..) = /..
- None => file_path.push("..".to_string()),
-
- // canonicalize(directory₀) = directory₁/..
- // ──────────────────────────────────────────────
- // canonicalize(directory₀/..) = directory₁/../..
- Some(ref c) if c == ".." => {
- file_path.push("..".to_string());
- file_path.push("..".to_string());
- },
-
- // canonicalize(directory₀) = directory₁/component
- // ─────────────────────────────────────────────── ; If "component" is not
- // canonicalize(directory₀/..) = directory₁ ; ".."
- Some(_) => continue,
- },
-
- // canonicalize(directory₀) = directory₁
- // ───────────────────────────────────────────────────────── ; If no other
- // canonicalize(directory₀/component) = directory₁/component ; rule matches
- Some(c) => file_path.push(c.clone()),
- }
- }
-
- File { file_path }
- }
-}
-
-impl<SubExpr: Copy> Canonicalize for ImportLocation<SubExpr> {
- fn canonicalize(&self) -> ImportLocation<SubExpr> {
- match self {
- ImportLocation::Local(prefix, file) => ImportLocation::Local(*prefix, file.canonicalize()),
- ImportLocation::Remote(url) => ImportLocation::Remote(URL {
- scheme: url.scheme,
- authority: url.authority.clone(),
- path: url.path.canonicalize(),
- query: url.query.clone(),
- headers: url.headers.clone(),
- }),
- ImportLocation::Env(name) => ImportLocation::Env(name.to_string()),
- ImportLocation::Missing => ImportLocation::Missing,
- }
- }
-}
diff --git a/dhall_syntax/src/parser.rs b/dhall_syntax/src/parser.rs
index 40784ec..1262774 100644
--- a/dhall_syntax/src/parser.rs
+++ b/dhall_syntax/src/parser.rs
@@ -564,15 +564,15 @@ impl Parsers {
},
))
}
- fn path(input: ParseInput<Rule>) -> ParseResult<File> {
+ fn path(input: ParseInput<Rule>) -> ParseResult<FilePath> {
Ok(parse_children!(input;
[path_component(components)..] => {
- File { file_path: components.collect() }
+ FilePath { file_path: components.collect() }
}
))
}
- fn local(input: ParseInput<Rule>) -> ParseResult<(FilePrefix, File)> {
+ fn local(input: ParseInput<Rule>) -> ParseResult<(FilePrefix, FilePath)> {
Ok(parse_children!(input;
[parent_path(l)] => l,
[here_path(l)] => l,
@@ -581,24 +581,24 @@ impl Parsers {
))
}
- fn parent_path(input: ParseInput<Rule>) -> ParseResult<(FilePrefix, File)> {
+ fn parent_path(input: ParseInput<Rule>) -> ParseResult<(FilePrefix, FilePath)> {
Ok(parse_children!(input;
[path(p)] => (FilePrefix::Parent, p)
))
}
- fn here_path(input: ParseInput<Rule>) -> ParseResult<(FilePrefix, File)> {
+ fn here_path(input: ParseInput<Rule>) -> ParseResult<(FilePrefix, FilePath)> {
Ok(parse_children!(input;
[path(p)] => (FilePrefix::Here, p)
))
}
- fn home_path(input: ParseInput<Rule>) -> ParseResult<(FilePrefix, File)> {
+ fn home_path(input: ParseInput<Rule>) -> ParseResult<(FilePrefix, FilePath)> {
Ok(parse_children!(input;
[path(p)] => (FilePrefix::Home, p)
))
}
fn absolute_path(
input: ParseInput<Rule>,
- ) -> ParseResult<(FilePrefix, File)> {
+ ) -> ParseResult<(FilePrefix, FilePath)> {
Ok(parse_children!(input;
[path(p)] => (FilePrefix::Absolute, p)
))