rusteval 0.2.0

Make your application's structs and functions interactive
Documentation
use rusteval::{InteractiveError, Methods};

#[derive(Debug, Default)]
struct TestStruct {
    field: u32,
}

#[Methods]
impl TestStruct {
    fn _new() -> Self {
        Self::default()
    }

    fn clone(&self) -> Self {
        Self { field: self.field }
    }

    fn get_field(&self) -> u32 {
        self.field
    }

    fn answer(&self) {
        println!("42");
    }

    fn total_len(&self, s1: &str, s2: &mut str) -> usize {
        s1.len() + s2.len()
    }
}

#[test]
fn test_call_no_args_primitive_return() {
    let mut test_struct = TestStruct::default();

    test_struct.eval_method_mut("get_field", "", &mut |result| {
        assert_eq!(format!("{:?}", result.unwrap()), "0")
    });
}

#[test]
fn test_call_no_args_no_return() {
    let mut test_struct = TestStruct::default();

    test_struct.eval_method_mut("answer", "", &mut |result| {
        assert_eq!(format!("{:?}", result.unwrap()), "()")
    });
}

#[test]
fn test_method_not_found() {
    use rusteval::InteractiveError;

    let mut test_struct = TestStruct::default();

    test_struct.eval_method_mut("yeet", "", &mut |result| {
        assert_eq!(
            result.unwrap_err(),
            InteractiveError::MethodNotFound {
                type_name: "TestStruct",
                method_name: "yeet"
            }
        )
    });
}

#[test]
fn test_clone_method() {
    let mut test_struct = TestStruct::default();

    test_struct.eval_method_mut("clone", "", &mut |result| {
        assert_eq!(format!("{:?}", result.unwrap()), "TestStruct { field: 0 }")
    });
}

#[test]
fn test_associated_function() {
    let mut test_struct = TestStruct::default();

    test_struct.eval_method_mut("_new", "", &mut |result| {
        assert_eq!(
            result.unwrap_err(),
            InteractiveError::MethodNotFound {
                type_name: "TestStruct",
                method_name: "_new"
            }
        )
    });
}

#[test]
fn test_too_many_args() {
    let mut test_struct = TestStruct::default();

    test_struct.eval_method_mut("answer", "43", &mut |result| {
        assert_eq!(
            result.unwrap_err(),
            InteractiveError::WrongNumberOfArguments {
                method_name: "answer",
                expected: 0,
                found: 1
            }
        )
    });
}

#[test]
fn test_str_arg() {
    let test_struct = TestStruct::default();

    test_struct.eval_method("total_len", "\"abcde\", \"abc\"", &mut |result| {
        assert_eq!(format!("{:?}", result.unwrap()), "8")
    });
}