diff options
Diffstat (limited to '')
-rw-r--r-- | dhall/src/lib.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/dhall/src/lib.rs b/dhall/src/lib.rs index 4e56264..4e183b4 100644 --- a/dhall/src/lib.rs +++ b/dhall/src/lib.rs @@ -6,3 +6,49 @@ mod normalize; pub use crate::normalize::*; pub mod imports; pub mod typecheck; + +use dhall_core::*; +use std::fs::File; +use std::io::Read; +use std::path::Path; +use std::fmt; + +#[derive(Debug)] +pub enum DhallError { + ParseError(parser::ParseError), + IOError(std::io::Error), +} +impl From<parser::ParseError> for DhallError { + fn from(e: parser::ParseError) -> Self { + DhallError::ParseError(e) + } +} +impl From<std::io::Error> for DhallError { + fn from(e: std::io::Error) -> Self { + DhallError::IOError(e) + } +} +impl fmt::Display for DhallError { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + use self::DhallError::*; + match self { + ParseError(e) => e.fmt(f), + IOError(e) => e.fmt(f), + } + } +} + +/// `source_pool` is a Vec of strings to be used to store the contents of imported files. +/// No ideal but necessary for lifetime reasons for now. +pub fn load_dhall_file<'i, 'a: 'i>( + f: &Path, + source_pool: &'a mut Vec<String>, + resolve_imports: bool, +) -> Result<Expr<'i, X, X>, DhallError> { + source_pool.push(String::new()); + let mut buffer = source_pool.last_mut().unwrap(); + File::open(f)?.read_to_string(&mut buffer)?; + let expr = parser::parse_expr(&*buffer)?; + let expr = imports::resolve_imports(&expr); + Ok(expr) +} |