module puppeteer.value_adapter.value_adapter;

import test.puppeteer.value_adapter.value_adapter : test;
mixin test;

import puppeteer.value_adapter.invalid_adapter_expression_exception;

import arith_eval.evaluable;

shared struct ValueAdapter(T)
{
    private Evaluable!(T, "x") evaluable;
    private string _expression;

    @property
    public string expression() const
    {
        return _expression;
    }

    @property
    private void expression(string rhs)
    {
        _expression = rhs;
    }

    this(string xBasedValueAdapterExpr)
    {
        try
        {
            evaluable = Evaluable!(T,"x")(xBasedValueAdapterExpr);
        }
        catch(InvalidExpressionException e)
        {
            throw new InvalidAdapterExpressionException("Can't create ValueAdapter with expression " ~ xBasedValueAdapterExpr);
        }

        expression = xBasedValueAdapterExpr;
    }

    T opCall(T value) const
    {
        return evaluable(value);
    }
}