ISibboI / evalexpr

A powerful expression evaluation crate 🦀.
GNU Affero General Public License v3.0
325 stars 54 forks source link

Feature Request: Add dot notation operator support (attribute getter) #149

Open sweihub opened 1 year ago

sweihub commented 1 year ago

Hi Mr. @ISibboI

I poke around the threads and find related issue: https://github.com/ISibboI/evalexpr/issues/117, this is similar to what I am looking for, I will make a pull request if you aggree with my proposal.

We would like to expand the dot notation to attribute getter operator, object.field will be redirected to a user defined function dot(object, "field", ()), the user is responsbible for implementing it, now we are able to mimic object in a simple way.

Expected usage

eval_with_context_mut("
    f = future("IC2312");
    bid = f.bid * 1.001;
    // call the method
    f.buy(30.5, 100);
    // return the prices
    (bid, f.ask, f.mid, f.last)
",
&mut context);

User defined dot functions will handle this:

Kindly review and discuss, thanks!

sweihub commented 1 year ago

@ISibboI Do you have one minute to review this?

sweihub commented 1 year ago

I've implemented this, please review the PR: https://github.com/ISibboI/evalexpr/pull/153, thanks!

#[test]
fn test_dot_attribute() {
    let mut context = HashMapContext::new();
    // omitted, check the PR
    ...
    assert_eq!(
        eval_with_context_mut(
            "v = array(1,2,3,4,5); 
             v = v.push(6); 
             v.length == v.get(5)",
            &mut context
        ),
        Ok(Value::Boolean(true))
    );
}