From 4e0bb7a6cc583443f1a3bd83f39083ffa0b26a54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Tue, 12 Jan 2021 23:32:57 +0100 Subject: move most of main to lib.rs --- src/lib.rs | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 65 +---------------------------------------------------------- 2 files changed, 68 insertions(+), 64 deletions(-) create mode 100644 src/lib.rs (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..aef8c53 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,67 @@ +use std::path::Path; + +pub mod compiler; +pub mod tokenizer; +pub mod vm; + +mod error; + +use error::Error; +use tokenizer::TokenStream; + +pub fn run_file(path: &Path) -> Result<(), Vec> { + run(tokenizer::file_to_tokens(path), path) +} + +pub fn run_string(s: &str) -> Result<(), Vec> { + run(tokenizer::string_to_tokens(s), Path::new("builtin")) +} + +pub fn run(tokens: TokenStream, path: &Path) -> Result<(), Vec> { + match compiler::compile("main", path, tokens) { + Ok(block) => vm::run_block(block).or_else(|e| Err(vec![e])), + Err(errors) => Err(errors), + } +} + +#[cfg(test)] +mod tests { + use super::{run_file, run_string}; + use crate::error::{Error, ErrorKind}; + use std::path::Path; + + macro_rules! assert_errs { + ($result:expr, [ $( $kind:pat ),* ]) => { + println!("{} => {:?}", stringify!($result), $result); + assert!(matches!( + $result.unwrap_err().as_slice(), + &[$(Error { + kind: $kind, + file: _, + line: _, + message: _, + }, + )*] + )) + }; + } + + #[test] + fn unreachable_token() { + assert_errs!(run_string("\n"), [ErrorKind::Unreachable]); + } + + macro_rules! test_file { + ($fn:ident, $path:literal) => { + #[test] + fn $fn() { + let file = Path::new($path); + assert!(run_file(&file).is_ok()); + } + }; + } + test_file!(order_of_operations, "tests/order-of-operations.tdy"); + test_file!(variables, "tests/variables.tdy"); + test_file!(scoping, "tests/scoping.tdy"); + test_file!(if_, "tests/if.tdy"); +} diff --git a/src/main.rs b/src/main.rs index e25aab4..ab5f4a0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,6 @@ use std::path::{Path, PathBuf}; -mod error; -mod tokenizer; -mod vm; -mod compiler; - -use error::Error; -use tokenizer::TokenStream; +use tihdy::run_file; fn main() { let file = file_from_args().unwrap_or_else(|| Path::new("tests/simple.tdy").to_owned()); @@ -21,60 +15,3 @@ fn main() { fn file_from_args() -> Option { std::env::args().skip(1).map(|s| Path::new(&s).to_owned()).find(|p| p.is_file()) } - -fn run_file(path: &Path) -> Result<(), Vec> { - run(tokenizer::file_to_tokens(path), path) -} - -fn run_string(s: &str) -> Result<(), Vec> { - run(tokenizer::string_to_tokens(s), Path::new("builtin")) -} - -fn run(tokens: TokenStream, path: &Path) -> Result<(), Vec> { - match compiler::compile("main", path, tokens) { - Ok(block) => vm::run_block(block).or_else(|e| Err(vec![e])), - Err(errors) => Err(errors), - } -} - -#[cfg(test)] -mod tests { - use super::{run_file, run_string}; - use crate::error::{Error, ErrorKind}; - use std::path::Path; - - macro_rules! assert_errs { - ($result:expr, [ $( $kind:pat ),* ]) => { - println!("{} => {:?}", stringify!($result), $result); - assert!(matches!( - $result.unwrap_err().as_slice(), - &[$(Error { - kind: $kind, - file: _, - line: _, - message: _, - }, - )*] - )) - }; - } - - #[test] - fn unreachable_token() { - assert_errs!(run_string("\n"), [ErrorKind::Unreachable]); - } - - macro_rules! test_file { - ($fn:ident, $path:literal) => { - #[test] - fn $fn() { - let file = Path::new($path); - assert!(run_file(&file).is_ok()); - } - }; - } - test_file!(order_of_operations, "tests/order-of-operations.tdy"); - test_file!(variables, "tests/variables.tdy"); - test_file!(scoping, "tests/scoping.tdy"); - test_file!(ifs, "tests/if.tdy"); -} -- cgit v1.2.1