module orelang.operator.AssertOperator;
import orelang.operator.IOperator,
       orelang.Engine,
       orelang.Value;

class AssertOperator : IOperator {
  /**
   * call
   */
  public Value call(Engine engine, Value[] args) {
    Value evaled = engine.eval(args[0]);
    bool flag;

    switch (evaled.type) with (ValueType) {
      case Bool:
        flag = evaled.getBool;
        break;
      case Numeric:
        flag = cast(bool)evaled.getNumeric;
        break;
      default:
        flag = true;
        break;
    }

    if (!flag) {
      throw new Exception("Assertion failed: " ~ args[0].toString);
    }

    return new Value(true);
  }
}