Refactor as Rust workspace
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
use std::{
|
||||
fmt::Display,
|
||||
io::{Result, Write},
|
||||
};
|
||||
|
||||
use super::{luajit::LuaJIT, luau::Luau};
|
||||
|
||||
pub struct Infix<T> {
|
||||
rhs: &'static str,
|
||||
inner: T,
|
||||
}
|
||||
|
||||
impl<T> Infix<T> {
|
||||
pub fn new(rhs: &'static str, inner: T) -> Self {
|
||||
Infix { rhs, inner }
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> Display for Infix<T>
|
||||
where
|
||||
T: Display,
|
||||
{
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
self.inner.fmt(f)?;
|
||||
self.rhs.fmt(f)
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Edition {
|
||||
fn runtime(&self) -> &'static str;
|
||||
|
||||
fn start_block(&self, w: &mut dyn Write) -> Result<()>;
|
||||
fn start_loop(&self, level: usize, w: &mut dyn Write) -> Result<()>;
|
||||
fn start_if(&self, cond: &str, w: &mut dyn Write) -> Result<()>;
|
||||
fn end_block(&self, level: usize, w: &mut dyn Write) -> Result<()>;
|
||||
fn end_loop(&self, w: &mut dyn Write) -> Result<()>;
|
||||
fn end_if(&self, level: usize, w: &mut dyn Write) -> Result<()>;
|
||||
|
||||
fn br_target(&self, level: usize, in_loop: bool, w: &mut dyn Write) -> Result<()>;
|
||||
fn br_to_level(&self, level: usize, up: usize, is_loop: bool, w: &mut dyn Write) -> Result<()>;
|
||||
|
||||
fn i64(&self, i: i64) -> Infix<i64>;
|
||||
}
|
||||
|
||||
pub fn from_string(name: &str) -> Option<&'static dyn Edition> {
|
||||
match name.to_ascii_lowercase().as_str() {
|
||||
"luau" => Some(&Luau),
|
||||
"luajit" => Some(&LuaJIT),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
use std::io::{Result, Write};
|
||||
|
||||
use super::data::{Edition, Infix};
|
||||
|
||||
pub struct LuaJIT;
|
||||
|
||||
impl Edition for LuaJIT {
|
||||
fn runtime(&self) -> &'static str {
|
||||
"'luajit'"
|
||||
}
|
||||
|
||||
fn start_block(&self, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "do ")
|
||||
}
|
||||
|
||||
fn start_loop(&self, level: usize, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "do ")?;
|
||||
write!(w, "::continue_at_{}::", level)
|
||||
}
|
||||
|
||||
fn start_if(&self, cond: &str, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "if {} ~= 0 then ", cond)
|
||||
}
|
||||
|
||||
fn end_block(&self, level: usize, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "::continue_at_{}::", level)?;
|
||||
write!(w, "end ")
|
||||
}
|
||||
|
||||
fn end_loop(&self, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "end ")
|
||||
}
|
||||
|
||||
fn end_if(&self, level: usize, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "::continue_at_{}::", level)?;
|
||||
write!(w, "end ")
|
||||
}
|
||||
|
||||
fn br_target(&self, _level: usize, _in_loop: bool, _w: &mut dyn Write) -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn br_to_level(
|
||||
&self,
|
||||
level: usize,
|
||||
up: usize,
|
||||
_is_loop: bool,
|
||||
w: &mut dyn Write,
|
||||
) -> Result<()> {
|
||||
write!(w, "goto continue_at_{} ", level - up)
|
||||
}
|
||||
|
||||
fn i64(&self, i: i64) -> Infix<i64> {
|
||||
Infix::new("LL", i)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
use std::io::{Result, Write};
|
||||
|
||||
use super::data::{Edition, Infix};
|
||||
|
||||
pub struct Luau;
|
||||
|
||||
impl Edition for Luau {
|
||||
fn runtime(&self) -> &'static str {
|
||||
"script.Runtime"
|
||||
}
|
||||
|
||||
fn start_block(&self, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "while true do ")
|
||||
}
|
||||
|
||||
fn start_loop(&self, _level: usize, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "while true do ")
|
||||
}
|
||||
|
||||
fn start_if(&self, cond: &str, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "while true do ")?;
|
||||
write!(w, "if {} ~= 0 then ", cond)
|
||||
}
|
||||
|
||||
fn end_block(&self, _level: usize, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "break ")?;
|
||||
write!(w, "end ")
|
||||
}
|
||||
|
||||
fn end_loop(&self, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "break ")?;
|
||||
write!(w, "end ")
|
||||
}
|
||||
|
||||
fn end_if(&self, _level: usize, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "end ")?;
|
||||
write!(w, "break ")?;
|
||||
write!(w, "end ")
|
||||
}
|
||||
|
||||
fn br_target(&self, level: usize, in_loop: bool, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "if desired then ")?;
|
||||
write!(w, "if desired == {} then ", level)?;
|
||||
write!(w, "desired = nil ")?;
|
||||
|
||||
if in_loop {
|
||||
write!(w, "continue ")?;
|
||||
}
|
||||
|
||||
write!(w, "end ")?;
|
||||
write!(w, "break ")?;
|
||||
write!(w, "end ")
|
||||
}
|
||||
|
||||
fn br_to_level(&self, level: usize, up: usize, is_loop: bool, w: &mut dyn Write) -> Result<()> {
|
||||
write!(w, "do ")?;
|
||||
|
||||
if up == 0 {
|
||||
if is_loop {
|
||||
write!(w, "continue ")?;
|
||||
} else {
|
||||
write!(w, "break ")?;
|
||||
}
|
||||
} else {
|
||||
write!(w, "desired = {} ", level - up)?;
|
||||
write!(w, "break ")?;
|
||||
}
|
||||
|
||||
write!(w, "end ")
|
||||
}
|
||||
|
||||
fn i64(&self, i: i64) -> Infix<i64> {
|
||||
Infix::new("", i)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
pub mod data;
|
||||
pub mod luajit;
|
||||
pub mod luau;
|
||||
Reference in New Issue
Block a user