How can I invoke an unknown Rust function with some arguments using reflection?

reflection, rust

Solution

Traits are the expected way to implement a fair amount of what reflection is (ab)used for elsewhere.

trait SomeInterface {
    fn exposed1(&self, a: &str) -> bool;
    fn exposed2(&self, b: i32) -> i32;
}

struct Implementation1 {
    value: i32,
    has_foo: bool,
}

impl SomeInterface for Implementation1 {
    fn exposed1(&self, _a: &str) -> bool {
        self.has_foo
    }

    fn exposed2(&self, b: i32) -> i32 {
        self.value * b
    }
}

fn test_interface(obj: &dyn SomeInterface) {
    println!("{}", obj.exposed2(3));
}

fn main() {
    let impl1 = Implementation1 {
        value: 1,
        has_foo: false,
    };
    test_interface(&impl1);
}

Problem

I'm having a lot of fun playing around with Rust having been a C# programmer for a long time but I have a question around reflection. Maybe I don't need reflection in this case but given that Rust is strongly typed I suspect I do (I would definitely need it in good ol' C#, bless its cotton socks). I have this situation: ``` use std::collections::HashMap; fn invoke_an_unknown_function( hashmap: HashMap<String, String>, // Something to denote a function I know nothing about goes here ) { // For each key in the hash map, assign the value // to the parameter argument whose name is the key // and then invoke the function } ``` How would I do that? I'm guessing I need to pass in some sort of `MethodInfo` as the second argument to the function and then poke around with that to get the arguments whose name is the key in the hash map and assign the values but I had a look around for the reflection API and found the following pre-Rust 1.0 documentation: - Module `std::reflect` - Module `std::repr` - [rust-dev] Reflection system None of these give me enough to go on to get started. How would I implement the function I describe above?

Original source