use std::error::Error;
use nom::Finish;
use super::parser;
use super::prelude::*;
pub fn parse(code: &str) -> Result<Vec<Expression>, ParseError> {
match parser::parse(code).finish() {
Ok(parse_result) => Ok(parse_result.1),
Err(e) => Err(e.into()),
}
}
pub fn run<'a>(code: &'a str) -> Result<Vec<u8>, BfError<'a, std::io::Error>> {
run_with_io(code, &mut std::io::stdin(), &mut std::io::stdout())
}
pub fn run_with_io<'a, IoErr: Error>(
code: &'a str,
in_stream: &mut dyn BfInStream<IoErr>,
out_stream: &mut dyn BfOutStream<IoErr>,
) -> Result<Vec<u8>, BfError<'a, IoErr>> {
let exps = parse(code)?;
let mut context = Context::new();
context.eval_many(&exps, in_stream, out_stream)?;
Ok(context.data)
}