diff options
author | Nadrieril Feneanar | 2019-09-03 17:29:49 +0200 |
---|---|---|
committer | GitHub | 2019-09-03 17:29:49 +0200 |
commit | b263635ce54a28dc4598e0f2832a456eca7521fa (patch) | |
tree | 06377aaa05944f90280cc9eb6be1847c1a1cf01b /dhall_syntax/src/core/import.rs | |
parent | 249f31c030dc8cf8c2c8065409b3f7e87639aad3 (diff) | |
parent | d0cc3ceb96870a6d951aab5afec1140404e67492 (diff) |
Merge pull request #111 from Nadrieril/resolve-mut
Resolve imports by mutating Expr instead of cloning it
Diffstat (limited to '')
-rw-r--r-- | dhall_syntax/src/core/import.rs | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/dhall_syntax/src/core/import.rs b/dhall_syntax/src/core/import.rs index d1f3fca..43597df 100644 --- a/dhall_syntax/src/core/import.rs +++ b/dhall_syntax/src/core/import.rs @@ -57,7 +57,7 @@ pub struct Import<SubExpr> { } impl<SE> URL<SE> { - pub fn visit_subexpr<'a, Err, SE2>( + pub fn traverse_ref<'a, Err, SE2>( &'a self, f: impl FnOnce(&'a SE) -> Result<SE2, Err>, ) -> Result<URL<SE2>, Err> { @@ -70,32 +70,56 @@ impl<SE> URL<SE> { headers, }) } + pub fn traverse_mut<'a, Err>( + &'a mut self, + f: impl FnOnce(&'a mut SE) -> Result<(), Err>, + ) -> Result<(), Err> { + if let Some(header) = &mut self.headers { + f(header)?; + } + Ok(()) + } } impl<SE> ImportLocation<SE> { - pub fn visit_subexpr<'a, Err, SE2>( + pub fn traverse_ref<'a, Err, SE2>( &'a self, f: impl FnOnce(&'a SE) -> Result<SE2, Err>, ) -> Result<ImportLocation<SE2>, Err> { use ImportLocation::*; Ok(match self { Local(prefix, path) => Local(*prefix, path.clone()), - Remote(url) => Remote(url.visit_subexpr(f)?), + Remote(url) => Remote(url.traverse_ref(f)?), Env(env) => Env(env.clone()), Missing => Missing, }) } + pub fn traverse_mut<'a, Err>( + &'a mut self, + f: impl FnOnce(&'a mut SE) -> Result<(), Err>, + ) -> Result<(), Err> { + if let ImportLocation::Remote(url) = self { + url.traverse_mut(f)?; + } + Ok(()) + } } impl<SE> Import<SE> { - pub fn visit_subexpr<'a, Err, SE2>( + pub fn traverse_ref<'a, Err, SE2>( &'a self, f: impl FnOnce(&'a SE) -> Result<SE2, Err>, ) -> Result<Import<SE2>, Err> { Ok(Import { mode: self.mode, - location: self.location.visit_subexpr(f)?, + location: self.location.traverse_ref(f)?, hash: self.hash.clone(), }) } + pub fn traverse_mut<'a, Err>( + &'a mut self, + f: impl FnOnce(&'a mut SE) -> Result<(), Err>, + ) -> Result<(), Err> { + self.location.traverse_mut(f) + } } |