rune
rune copied to clipboard
Printable errors
Add a module std::error
that adds ty::<rune::Error>
and assosiated_function(STRING_DISPLAY, ...)
I propose using the debug representation to print actual useful errors i.e. write!(f, "{self:?}")
fn error() -> Result<Module> {
let mut module = Module::with_crate_item("std", ["error"]);
fn display_error(error: &rune::Error, buf: &mut String) -> fmt::Result {
write!(buf, "{error:?}")
}
module.ty::<rune::Error>()?;
module.associated_function(Protocol::STRING_DISPLAY, display_error)?;
Ok(module)
}
I'm not sure I want rune::Error
to be a type integrated into rune scripts right now. The std::error::Error
is also a very generic location. But let's discuss!
it is the current location actually https://github.com/rune-rs/rune/blob/e5b7a3a1095768b26fa05ec4e2857aba78a019f7/crates/rune/src/any.rs#L86
Yeah, I did not remember that. Must be a hangover from old functions that could just "error". I'd honestly be prone to removing it. :thinking:
It would be neat though to have something to easily produce readable errors, and anyhow is quite simple to use :D. Another thing is that the hash is really not that easily understood as the display for anyhow is missing :D
Error: Missing function with hash
0x811b62957ea9d9f9
I'd be fine with having it in e.g. an anyhow
module in rune-modules
but without this e.g. the toml parser doesn't produce readable errors IIRC.
Ah. So readable errors can be produced: Anything can be used as an error in Rune, and if it implements STRING_DISPLAY
which is expected by errors, it can be printed.
What anyhow gives you is stacktraces and the ability to wrap any error. If those added capabilities aren't used, they don't need to be their own type.
What anyhow gives you is stacktraces and the ability to wrap any error. If those added capabilities aren't use, they don't need to be their own type.
Yes, for sure, and one probably should have a custom error type at some point, this would just be a way to get easily started, and the problem would be that only rune could implement Any
for anyhow::Error
and therefor would need to decide where it lives. Otherwise, one would need to make a wrapper around it.