mirror of
https://github.com/lune-org/lune.git
synced 2025-05-04 10:43:57 +01:00
Make runtime return values into a non exhaustive struct to prevent future breakage
This commit is contained in:
parent
74375ff708
commit
4ce2d3a80f
6 changed files with 53 additions and 14 deletions
|
@ -57,7 +57,7 @@ impl RunCommand {
|
||||||
eprintln!("{err}");
|
eprintln!("{err}");
|
||||||
ExitCode::FAILURE
|
ExitCode::FAILURE
|
||||||
}
|
}
|
||||||
Ok((code, _)) => ExitCode::from(code),
|
Ok(values) => ExitCode::from(values.status()),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,4 +5,4 @@ mod rt;
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests;
|
mod tests;
|
||||||
|
|
||||||
pub use crate::rt::{Runtime, RuntimeError, RuntimeResult};
|
pub use crate::rt::{Runtime, RuntimeError, RuntimeResult, RuntimeReturnValues};
|
||||||
|
|
|
@ -2,4 +2,4 @@ mod result;
|
||||||
mod runtime;
|
mod runtime;
|
||||||
|
|
||||||
pub use self::result::{RuntimeError, RuntimeResult};
|
pub use self::result::{RuntimeError, RuntimeResult};
|
||||||
pub use self::runtime::Runtime;
|
pub use self::runtime::{Runtime, RuntimeReturnValues};
|
||||||
|
|
|
@ -11,6 +11,46 @@ use mlua_luau_scheduler::{Functions, Scheduler};
|
||||||
|
|
||||||
use super::{RuntimeError, RuntimeResult};
|
use super::{RuntimeError, RuntimeResult};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Values returned by running a Lune runtime until completion.
|
||||||
|
*/
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub struct RuntimeReturnValues {
|
||||||
|
/// The exit code manually returned from the runtime, if any.
|
||||||
|
pub code: Option<u8>,
|
||||||
|
/// Whether any errors were thrown from threads
|
||||||
|
/// that were not the main thread, or not.
|
||||||
|
pub errored: bool,
|
||||||
|
/// The final values returned by the main thread.
|
||||||
|
pub values: LuaMultiValue,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl RuntimeReturnValues {
|
||||||
|
/**
|
||||||
|
Returns the final, combined "status" of the runtime return values.
|
||||||
|
|
||||||
|
If no exit code was explicitly set by either the main thread,
|
||||||
|
or any threads it may have spawned, the status will be either:
|
||||||
|
|
||||||
|
- `0` if no threads errored
|
||||||
|
- `1` if any threads errored
|
||||||
|
*/
|
||||||
|
#[must_use]
|
||||||
|
pub fn status(&self) -> u8 {
|
||||||
|
self.code.unwrap_or(u8::from(self.errored))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns whether the run was considered successful, or not.
|
||||||
|
|
||||||
|
See [`RuntimeReturnValues::status`] for more information.
|
||||||
|
*/
|
||||||
|
#[must_use]
|
||||||
|
pub fn success(&self) -> bool {
|
||||||
|
self.status() == 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
A Lune runtime.
|
A Lune runtime.
|
||||||
*/
|
*/
|
||||||
|
@ -125,7 +165,7 @@ impl Runtime {
|
||||||
&mut self,
|
&mut self,
|
||||||
script_name: impl AsRef<str>,
|
script_name: impl AsRef<str>,
|
||||||
script_contents: impl AsRef<[u8]>,
|
script_contents: impl AsRef<[u8]>,
|
||||||
) -> RuntimeResult<(u8, Vec<LuaValue>)> {
|
) -> RuntimeResult<RuntimeReturnValues> {
|
||||||
// Add error callback to format errors nicely + store status
|
// Add error callback to format errors nicely + store status
|
||||||
let got_any_error = Arc::new(AtomicBool::new(false));
|
let got_any_error = Arc::new(AtomicBool::new(false));
|
||||||
let got_any_inner = Arc::clone(&got_any_error);
|
let got_any_inner = Arc::clone(&got_any_error);
|
||||||
|
@ -148,16 +188,15 @@ impl Runtime {
|
||||||
let main_thread_id = self.sched.push_thread_back(main, ())?;
|
let main_thread_id = self.sched.push_thread_back(main, ())?;
|
||||||
self.sched.run().await;
|
self.sched.run().await;
|
||||||
|
|
||||||
let main_thread_res = match self.sched.get_thread_result(main_thread_id) {
|
let main_thread_values = match self.sched.get_thread_result(main_thread_id) {
|
||||||
Some(res) => res,
|
Some(res) => res,
|
||||||
None => LuaValue::Nil.into_lua_multi(&self.lua),
|
None => LuaValue::Nil.into_lua_multi(&self.lua),
|
||||||
}?;
|
}?;
|
||||||
|
|
||||||
Ok((
|
Ok(RuntimeReturnValues {
|
||||||
self.sched
|
code: self.sched.get_exit_code(),
|
||||||
.get_exit_code()
|
errored: got_any_error.load(Ordering::SeqCst),
|
||||||
.unwrap_or(u8::from(got_any_error.load(Ordering::SeqCst))),
|
values: main_thread_values,
|
||||||
main_thread_res.into_vec(),
|
})
|
||||||
))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,6 @@ pub async fn run(patched_bin: impl AsRef<[u8]>) -> Result<ExitCode> {
|
||||||
eprintln!("{err}");
|
eprintln!("{err}");
|
||||||
ExitCode::FAILURE
|
ExitCode::FAILURE
|
||||||
}
|
}
|
||||||
Ok((code, _)) => ExitCode::from(code),
|
Ok(values) => ExitCode::from(values.status()),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,8 +44,8 @@ macro_rules! create_tests {
|
||||||
.trim_end_matches(".luau")
|
.trim_end_matches(".luau")
|
||||||
.trim_end_matches(".lua")
|
.trim_end_matches(".lua")
|
||||||
.to_string();
|
.to_string();
|
||||||
let (exit_code, _) = lune.run(&script_name, &script).await?;
|
let script_values = lune.run(&script_name, &script).await?;
|
||||||
Ok(ExitCode::from(exit_code))
|
Ok(ExitCode::from(script_values.status()))
|
||||||
}
|
}
|
||||||
)* }
|
)* }
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue