How to do a std::any::Any::downcast(Box) or return Box?

⚓ Rust    📅 2026-01-07    👤 surdeus    👁️ 1      

surdeus

How to handle downcasting such that in case of failure i can return argument that was passed in function call?

Code available in playground.

struct Obj;

fn cast_or_return(initial_obj: Box<dyn MyTrait>) -> Result<Box<Obj>, Box<dyn MyTrait>> {
    let any_obj: Box<dyn Any> = initial_obj;

    match any_obj.downcast::<Obj>() {
        | Ok(done) => {
            Ok(done)
        }

        | Err(another_obj) => {
            // How to upcast back to initial_object?
            let cast_back: Box<dyn MyTrait> = another_obj;
            Err(cast_back)

            //Ok(Box::new(Obj))
        }
    }

}

fn main() {
    let o: Box<dyn MyTrait> = Box::new(Obj);
    cast_or_return(o).ok();
}


use std::any::Any;
trait MyTrait: Any {}
impl MyTrait for Obj {}

I just can't come up with any sane way to solve this. Any ideas would be appreciated.

4 posts - 2 participants

Read full topic

🏷️ Rust_feed