use std::any::Any;
use salsa::Cancelled;
pub fn is_cancelled(err: &(dyn Any + Send)) -> bool {
err.is::<Cancelled>()
|| err.downcast_ref::<&str>().is_some_and(|msg| {
msg.contains("assertion failed: old_memo.revisions.changed_at <= revisions.changed_at")
})
}
pub fn cancelled_anyhow(
err: Box<dyn Any + Send>,
context: &'static str,
) -> Result<anyhow::Error, Box<dyn Any + Send>> {
match err.downcast::<Cancelled>() {
Ok(err) => Ok(anyhow::Error::new(err).context(context)),
Err(err) => match err.downcast::<&str>() {
Ok(msg)
if msg.contains(
"assertion failed: old_memo.revisions.changed_at <= revisions.changed_at",
) =>
{
Ok(anyhow::Error::msg(msg).context(context))
}
Ok(msg) => Err(Box::new(msg)),
Err(err) => Err(err),
},
}
}