Fix main program

This commit is contained in:
Rerumu 2022-04-27 04:33:47 -04:00
parent c5a1afb228
commit bfb900f044

View File

@ -1,8 +1,9 @@
use parity_wasm::{deserialize_file, elements::Module}; use std::io::{Result, Write};
use codegen_luajit::gen::Generator as LuaJIT; use parity_wasm::{deserialize_file, elements::Module};
use codegen_luau::gen::Generator as Luau; use wasm_ast::builder::TypeInfo;
use wasm_ast::writer::Transpiler;
type Translator = fn(&Module, &TypeInfo, &mut dyn Write) -> Result<()>;
fn parse_module(name: &str) -> Module { fn parse_module(name: &str) -> Module {
let wasm = deserialize_file(name).expect("Failed to parse Wasm file"); let wasm = deserialize_file(name).expect("Failed to parse Wasm file");
@ -10,42 +11,26 @@ fn parse_module(name: &str) -> Module {
wasm.parse_names().unwrap_or_else(|v| v.1) wasm.parse_names().unwrap_or_else(|v| v.1)
} }
fn run_translator<'a, T: Transpiler<'a>>(wasm: &'a Module) { fn run_translator(wasm: &Module, runtime: &str, translator: Translator) {
let module = T::new(wasm); let mut pipe = std::io::stdout().lock();
let output = std::io::stdout(); let type_info = TypeInfo::from_module(wasm);
module write!(pipe, "local rt = (function() {runtime} end)() ").unwrap();
.transpile(&mut output.lock()) translator(wasm, &type_info, &mut pipe).unwrap();
.expect("Failed to transpile");
}
fn run_runtime<'a, T: Transpiler<'a>>() {
let output = std::io::stdout();
T::runtime(&mut output.lock()).expect("Failed to fetch runtime");
} }
fn do_translate(name: &str, file: &str) { fn do_translate(name: &str, file: &str) {
let wasm = &parse_module(file); let wasm = &parse_module(file);
match name.to_lowercase().as_str() { match name.to_lowercase().as_str() {
"luajit" => run_translator::<LuaJIT>(wasm), "luajit" => run_translator(wasm, codegen_luajit::RUNTIME, codegen_luajit::translate),
"luau" => run_translator::<Luau>(wasm), "luau" => run_translator(wasm, codegen_luau::RUNTIME, codegen_luau::translate),
_ => panic!("Bad language: {name}"), _ => panic!("Bad language: {name}"),
} }
} }
fn do_runtime(name: &str) {
match name.to_lowercase().as_str() {
"luajit" => run_runtime::<LuaJIT>(),
"luau" => run_runtime::<Luau>(),
_ => panic!("Bad runtime: {name}"),
}
}
fn do_help() { fn do_help() {
println!("usage: program translate <lang> <file>"); println!("usage: program translate <lang> <file>");
println!(" or: program runtime <lang>");
println!(" or: program help"); println!(" or: program help");
} }
@ -54,11 +39,6 @@ fn main() {
match args.next().as_deref().unwrap_or("help") { match args.next().as_deref().unwrap_or("help") {
"help" => do_help(), "help" => do_help(),
"runtime" => {
let lang = args.next().expect("No runtime specified");
do_runtime(&lang);
}
"translate" => { "translate" => {
let lang = args.next().expect("No language specified"); let lang = args.next().expect("No language specified");
let file = args.next().expect("No file specified"); let file = args.next().expect("No file specified");