| 430 | //--- Public API --- |
| 431 | |
| 432 | Expected<ScriptFunction> ParseScript(const std::string& script) |
| 433 | { |
| 434 | try |
| 435 | { |
| 436 | auto exprs = Scripting::parseStatements(script); |
| 437 | if(exprs.empty()) |
| 438 | { |
| 439 | return nonstd::make_unexpected("Empty Script"); |
| 440 | } |
| 441 | return [exprs = std::move(exprs), script](Ast::Environment& env) { |
| 442 | try |
| 443 | { |
| 444 | for(size_t i = 0; i < exprs.size() - 1; ++i) |
| 445 | { |
| 446 | exprs[i]->evaluate(env); |
| 447 | } |
| 448 | return exprs.back()->evaluate(env); |
| 449 | } |
| 450 | catch(RuntimeError& err) |
| 451 | { |
| 452 | throw RuntimeError(StrCat("Error in script [", script, "]\n", err.what())); |
| 453 | } |
| 454 | }; |
| 455 | } |
| 456 | catch(RuntimeError& err) |
| 457 | { |
| 458 | return nonstd::make_unexpected(err.what()); |
| 459 | } |
| 460 | } |
| 461 | |
| 462 | Expected<Any> ParseScriptAndExecute(Ast::Environment& env, const std::string& script) |
| 463 | { |