adding better api
This commit is contained in:
parent
91907a90ff
commit
dc0562553d
|
@ -553,6 +553,63 @@ pub fn run_test(
|
||||||
panic!("test failed");
|
panic!("test failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct Options {
|
||||||
|
pub fmt: bool,
|
||||||
|
pub fmt_current: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run_compiler(
|
||||||
|
root_file: &str,
|
||||||
|
options: Options,
|
||||||
|
out: &mut impl std::io::Write,
|
||||||
|
) -> io::Result<()> {
|
||||||
|
let parsed = parse_from_fs(1, root_file)?;
|
||||||
|
|
||||||
|
fn format_to_stdout(ast: parser::Ast) -> std::io::Result<()> {
|
||||||
|
let source = std::fs::read_to_string(&*ast.path)?;
|
||||||
|
parser::with_fmt_source(&source, || {
|
||||||
|
for expr in ast.exprs() {
|
||||||
|
use std::io::Write;
|
||||||
|
writeln!(std::io::stdout(), "{expr}")?;
|
||||||
|
}
|
||||||
|
std::io::Result::Ok(())
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn format_ast(ast: parser::Ast) -> std::io::Result<()> {
|
||||||
|
let source = std::fs::read_to_string(&*ast.path)?;
|
||||||
|
let mut output = Vec::new();
|
||||||
|
parser::with_fmt_source(&source, || {
|
||||||
|
for expr in ast.exprs() {
|
||||||
|
use std::io::Write;
|
||||||
|
writeln!(output, "{expr}")?;
|
||||||
|
}
|
||||||
|
std::io::Result::Ok(())
|
||||||
|
})?;
|
||||||
|
|
||||||
|
std::fs::write(&*ast.path, output)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
if options.fmt {
|
||||||
|
for parsed in parsed {
|
||||||
|
format_ast(parsed)?;
|
||||||
|
}
|
||||||
|
} else if options.fmt_current {
|
||||||
|
format_to_stdout(parsed.into_iter().next().unwrap())?;
|
||||||
|
} else {
|
||||||
|
let mut codegen = codegen::Codegen::default();
|
||||||
|
codegen.files = parsed;
|
||||||
|
|
||||||
|
codegen.generate();
|
||||||
|
codegen.dump(out)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
fn main() -> std::io::Result<()> {
|
fn main() -> std::io::Result<()> {
|
||||||
let args = std::env::args().collect::<Vec<_>>();
|
let args = std::env::args().collect::<Vec<_>>();
|
||||||
let args = args.iter().map(String::as_str).collect::<Vec<_>>();
|
let args = args.iter().map(String::as_str).collect::<Vec<_>>();
|
||||||
let root = args.get(1).copied().unwrap_or("main.hb");
|
|
||||||
|
|
||||||
if args.contains(&"--help") || args.contains(&"-h") {
|
if args.contains(&"--help") || args.contains(&"-h") {
|
||||||
println!("Usage: hbc [OPTIONS...] <FILE>");
|
println!("Usage: hbc [OPTIONS...] <FILE>");
|
||||||
|
@ -9,48 +8,12 @@ fn main() -> std::io::Result<()> {
|
||||||
return Err(std::io::ErrorKind::Other.into());
|
return Err(std::io::ErrorKind::Other.into());
|
||||||
}
|
}
|
||||||
|
|
||||||
let parsed = hblang::parse_from_fs(1, root)?;
|
hblang::run_compiler(
|
||||||
|
args.get(1).copied().unwrap_or("main.hb"),
|
||||||
fn format_to_stdout(ast: hblang::parser::Ast) -> std::io::Result<()> {
|
hblang::Options {
|
||||||
let source = std::fs::read_to_string(&*ast.path)?;
|
fmt: args.contains(&"--fmt"),
|
||||||
hblang::parser::with_fmt_source(&source, || {
|
fmt_current: args.contains(&"--fmt-current"),
|
||||||
for expr in ast.exprs() {
|
},
|
||||||
use std::io::Write;
|
&mut std::io::stdout(),
|
||||||
writeln!(std::io::stdout(), "{expr}")?;
|
)
|
||||||
}
|
|
||||||
std::io::Result::Ok(())
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
fn format_ast(ast: hblang::parser::Ast) -> std::io::Result<()> {
|
|
||||||
let source = std::fs::read_to_string(&*ast.path)?;
|
|
||||||
let mut output = Vec::new();
|
|
||||||
hblang::parser::with_fmt_source(&source, || {
|
|
||||||
for expr in ast.exprs() {
|
|
||||||
use std::io::Write;
|
|
||||||
writeln!(output, "{expr}")?;
|
|
||||||
}
|
|
||||||
std::io::Result::Ok(())
|
|
||||||
})?;
|
|
||||||
|
|
||||||
std::fs::write(&*ast.path, output)?;
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
if args.contains(&"--fmt") {
|
|
||||||
for parsed in parsed {
|
|
||||||
format_ast(parsed)?;
|
|
||||||
}
|
|
||||||
} else if args.contains(&"--fmt-current") {
|
|
||||||
format_to_stdout(parsed.into_iter().next().unwrap())?;
|
|
||||||
} else {
|
|
||||||
let mut codegen = hblang::codegen::Codegen::default();
|
|
||||||
codegen.files = parsed;
|
|
||||||
|
|
||||||
codegen.generate();
|
|
||||||
codegen.dump(&mut std::io::stdout())?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue