You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Seems #399 was already closed (4.5 years ago, for bad usecase & maybe backwards compatibility reasons?), but I have an actual use!
My logger writes a message on panic, but does so with a custom format different to anything you can write with the Log trait. So I need to be able to downcast the &dyn Log into my own logger from the panic handler. I could probably use a OnceLock to store if my logger's been initialized but log already does that with the (set_)logger methods, so it feels redundant.
For now my current way of doing this is this very cursed set of functions:
fnas_dyn_ref(logger:*constLogger) -> *constdynLog{// split into one function to always attach the same metadata
logger as*constdynLog}fnupcast_log(logger:&'staticLogger) -> &'staticdynLog{// SAFETY: as_dyn_ref returns a reference to the same object as passed inunsafe{&*as_dyn_ref(logger)}}fndowncast_log(log:&'staticdynLog) -> Option<&'staticLogger>{// horribly cursed implementation to fetch a reference to the installed loggerlet(logger_ptr, logger_meta) = (&rawconst*log).to_raw_parts();let(_, fake_logger_meta) = as_dyn_ref(ptr::null::<Logger>()).to_raw_parts();(logger_meta == fake_logger_meta).then(|| {// SAFETY: v-tables match so it's probably ours!unsafe{&*logger_ptr.cast::<Logger>()}})}
but that's a lot of unsafe, and nightly-only.
To prevent needing to add a + 'static bound on Log (which probably breaks compatibility somehow), yandros suggested (in rplcs #dark-arts) adding something like:
Seems #399 was already closed (4.5 years ago, for bad usecase & maybe backwards compatibility reasons?), but I have an actual use!
My logger writes a message on panic, but does so with a custom format different to anything you can write with the
Log
trait. So I need to be able to downcast the&dyn Log
into my own logger from the panic handler. I could probably use aOnceLock
to store if my logger's been initialized butlog
already does that with the (set_
)logger
methods, so it feels redundant.For now my current way of doing this is this very cursed set of functions:
but that's a lot of unsafe, and nightly-only.
To prevent needing to add a
+ 'static
bound onLog
(which probably breaks compatibility somehow), yandros suggested (in rplcs #dark-arts) adding something like:as an automatic implementation on the
Log
trait.The text was updated successfully, but these errors were encountered: