#include <iostream>
#include "uCalc.h"

using namespace std;
using namespace uCalcSoftware;

void ucalc_call RecoveryHandler(Handle_uCalc h) {
   auto uc = uCalc(h);
   cout << "Handler: Caught '" << uc.Error().Message() << "'" << endl;
   // Attempt to recover by resuming execution.
   uc.Error().Response(ErrorHandlerResponse::Resume);
   cout << "Handler: Resuming execution..." << endl;
}
void ucalc_call RiskyOperation(uCalcBase::Callback cb) {
   auto input = cb.ArgStr(1);
   if (input == "bad") {
      cb.Error().Raise("A recoverable error occurred.");
      // After the error handler resumes, this return value will be used.

   } else {
      cb.ReturnStr("Normal_OK");
   }
}
int main() {
   uCalc uc;
   uc.Error().AddHandler(RecoveryHandler);
   uc.DefineFunction("DoWork(s As String) As String", RiskyOperation);

   cout << "Result: " + uc.EvalStr("DoWork('good')") << endl;
   cout << "---" << endl;
   cout << "Result: " + uc.EvalStr("DoWork('bad')") << endl;
}