evalexpr icon indicating copy to clipboard operation
evalexpr copied to clipboard

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

Open sweihub opened this issue 2 years ago • 2 comments

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:

  • future("IC2312")
  • dot(f, "buy", (30.5, 100))
  • dot(f, "ask", ())
  • dot(f, "bid", ()), ...

Kindly review and discuss, thanks!

sweihub avatar Aug 21 '23 05:08 sweihub

@ISibboI Do you have one minute to review this?

sweihub avatar Aug 27 '23 07:08 sweihub

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))
    );
}

sweihub avatar Aug 27 '23 13:08 sweihub