diff --git a/crates/lune-utils/src/fmt/error.rs b/crates/lune-utils/src/fmt/error.rs new file mode 100644 index 0000000..2ab61db --- /dev/null +++ b/crates/lune-utils/src/fmt/error.rs @@ -0,0 +1,85 @@ +use mlua::prelude::*; + +/** + Source of a stack trace line parsed from a [`LuaError`]. +*/ +#[derive(Debug, Clone, Copy)] +pub enum StackTraceSource { + /// Error originated from a C function. + C, + /// Error originated from a Rust function. + Rust, + /// Error originated from [`mlua`]. + Mlua, + /// Error originated from a Lua (user) function. + User, +} + +/** + Stack trace line parsed from a [`LuaError`]. +*/ +#[derive(Debug, Clone)] +pub struct StackTraceLine { + source: StackTraceSource, + path: Option, + line_number: Option, + function_name: Option, +} + +impl StackTraceLine { + #[must_use] + pub fn source(&self) -> StackTraceSource { + self.source + } + + #[must_use] + pub fn path(&self) -> Option<&str> { + self.path.as_deref() + } + + #[must_use] + pub fn line_number(&self) -> Option { + self.line_number + } + + #[must_use] + pub fn function_name(&self) -> Option<&str> { + self.function_name.as_deref() + } +} + +/** + Stack trace parsed from a [`LuaError`]. +*/ +#[derive(Debug, Clone)] +pub struct StackTrace { + lines: Vec, +} + +impl StackTrace { + #[must_use] + pub fn lines(&self) -> &[StackTraceLine] { + &self.lines + } +} + +/** + Error components parsed from a [`LuaError`]. +*/ +#[derive(Debug, Clone)] +pub struct ErrorComponents { + message: String, + trace: StackTrace, +} + +impl ErrorComponents { + #[must_use] + pub fn message(&self) -> &str { + &self.message + } + + #[must_use] + pub fn trace(&self) -> &StackTrace { + &self.trace + } +} diff --git a/crates/lune-utils/src/fmt/mod.rs b/crates/lune-utils/src/fmt/mod.rs index 340cf5b..4d1e86a 100644 --- a/crates/lune-utils/src/fmt/mod.rs +++ b/crates/lune-utils/src/fmt/mod.rs @@ -1,3 +1,5 @@ +mod error; mod label; +pub use self::error::{ErrorComponents, StackTrace, StackTraceLine, StackTraceSource}; pub use self::label::Label;