From d62bc8bf86cff65145d5aea045b81122bc15d709 Mon Sep 17 00:00:00 2001 From: Dennis Ranke Date: Tue, 16 Nov 2021 23:30:25 +0100 Subject: [PATCH] make curlywas available as a library --- src/lib.rs | 33 +++++++++++++++++++++++++++++++++ src/main.rs | 24 +++--------------------- 2 files changed, 36 insertions(+), 21 deletions(-) create mode 100644 src/lib.rs diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..513a3ce --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,33 @@ +use anyhow::{bail, Result}; +use std::io::prelude::*; +use std::{fs::File, path::Path}; + +mod ast; +mod constfold; +mod emit; +mod intrinsics; +mod parser; +mod typecheck; + +type Span = std::ops::Range; + +pub fn compile_file>(path: P) -> Result> { + let mut input = String::new(); + File::open(path)?.read_to_string(&mut input)?; + + compile_str(&input) +} + +pub fn compile_str(input: &str) -> Result> { + let mut script = match parser::parse(&input) { + Ok(script) => script, + Err(_) => bail!("Parse failed"), + }; + + constfold::fold_script(&mut script); + if let Err(_) = typecheck::tc_script(&mut script, &input) { + bail!("Type check failed"); + } + let wasm = emit::emit(&script); + Ok(wasm) +} diff --git a/src/main.rs b/src/main.rs index 2f89a95..db3b222 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,15 +1,8 @@ -use anyhow::{anyhow, bail, Result}; +use anyhow::{anyhow, Result}; use std::io::prelude::*; use std::{fs::File, path::PathBuf}; -mod ast; -mod constfold; -mod emit; -mod parser; -mod typecheck; -mod intrinsics; - -type Span = std::ops::Range; +use curlywas::compile_file; fn main() -> Result<()> { let mut filename = PathBuf::from( @@ -17,19 +10,8 @@ fn main() -> Result<()> { .nth(1) .ok_or_else(|| anyhow!("Path to .hw file missing"))?, ); - let mut input = String::new(); - File::open(&filename)?.read_to_string(&mut input)?; - let mut script = match parser::parse(&input) { - Ok(script) => script, - Err(_) => bail!("Parse failed") - }; - - constfold::fold_script(&mut script); - if let Err(_) = typecheck::tc_script(&mut script, &input) { - bail!("Type check failed"); - } - let wasm = emit::emit(&script); + let wasm = compile_file(&filename)?; wasmparser::validate(&wasm)?;