140 #ifdef OT_USE_SCRIPT_CHAI
142 #include <chaiscript/chaiscript.hpp>
143 #ifdef OT_USE_CHAI_STDLIB
144 #include <chaiscript/chaiscript_stdlib.hpp>
150 bool OTScriptChai::ExecuteScript(OTVariable* pReturnVar)
152 using namespace chaiscript;
156 if (m_str_script.size() > 0) {
177 for (
auto& it : m_mapParties) {
178 OTParty* pParty = it.second;
181 std::string party_name = pParty->GetPartyName();
208 chai->add_global_const(const_var(party_name),
214 for (
auto& it : m_mapAccounts) {
215 OTPartyAccount* pAcct = it.second;
218 std::string acct_name = pAcct->GetName().Get();
227 chai->add_global_const(const_var(acct_name),
251 for (
auto& it : m_mapVariables) {
252 const std::string var_name = it.first;
253 OTVariable* pVar = it.second;
254 OT_ASSERT((
nullptr != pVar) && (var_name.size() > 0));
256 switch (pVar->GetType()) {
258 int32_t& nValue = pVar->GetValueInteger();
262 chai->add_global_const(const_var(pVar->CopyValueInteger()),
265 chai->add(var(&nValue),
272 bool& bValue = pVar->GetValueBool();
276 chai->add_global_const(const_var(pVar->CopyValueBool()),
279 chai->add(var(&bValue),
286 std::string& str_Value = pVar->GetValueString();
291 chai->add_global_const(const_var(pVar->CopyValueString()),
299 chai->add(var(&str_Value),
310 otErr <<
"OTScriptChai::ExecuteScript: Failure: Unknown "
311 "variable type for variable: " << var_name <<
"\n";
325 if (
nullptr == pReturnVar)
326 chai->eval(m_str_script.c_str(),
327 exception_specification<const std::exception&>(),
328 m_str_display_filename);
332 switch (pReturnVar->GetType()) {
334 int32_t nResult = chai->eval<int32_t>(
335 m_str_script.c_str(),
336 exception_specification<const std::exception&>(),
337 m_str_display_filename);
338 pReturnVar->SetValue(nResult);
342 bool bResult = chai->eval<
bool>(
343 m_str_script.c_str(),
344 exception_specification<const std::exception&>(),
345 m_str_display_filename);
346 pReturnVar->SetValue(bResult);
350 std::string str_Result = chai->eval<std::string>(
351 m_str_script.c_str(),
352 exception_specification<const std::exception&>(),
353 m_str_display_filename);
354 pReturnVar->SetValue(str_Result);
358 otErr <<
"OTScriptChai::ExecuteScript: Unknown return type "
360 "unable to service it.\n";
365 catch (
const chaiscript::exception::eval_error& ee) {
367 otErr <<
"OTScriptChai::ExecuteScript: \n Caught "
368 "chaiscript::exception::eval_error: \n " << ee.reason
369 <<
". \n File: " << ee.filename
371 " Start position, line: " << ee.start_position.line
372 <<
" column: " << ee.start_position.column
374 " End position, line: " << ee.end_position.line
375 <<
" column: " << ee.end_position.column <<
"\n\n";
377 std::cout << ee.what();
378 if (ee.call_stack.size() > 0) {
379 std::cout <<
"during evaluation at ("
380 << ee.call_stack[0]->start.line <<
", "
381 << ee.call_stack[0]->start.column <<
")";
383 std::cout << std::endl;
384 std::cout << std::endl;
387 if (ee.call_stack.size() > 0) {
396 for (
size_t j = 1; j < ee.call_stack.size(); ++j) {
397 if (ee.call_stack[j]->identifier !=
398 chaiscript::AST_Node_Type::Block &&
399 ee.call_stack[j]->identifier !=
400 chaiscript::AST_Node_Type::File) {
401 std::cout << std::endl;
402 std::cout <<
" from " << *(ee.call_stack[j]->filename)
403 <<
" (" << ee.call_stack[j]->start.line
404 <<
", " << ee.call_stack[j]->start.column
406 std::cout << ee.call_stack[j]->text << std::endl;
410 std::cout << std::endl;
414 catch (
const chaiscript::exception::bad_boxed_cast& e) {
416 otErr <<
"OTScriptChai::ExecuteScript: Caught "
417 "chaiscript::exception::bad_boxed_cast : "
418 << ((e.what() !=
nullptr) ? e.what()
419 :
"e.what() returned null, sorry")
423 catch (
const std::exception& e) {
425 otErr <<
"OTScriptChai::ExecuteScript: Caught std::exception "
426 "exception: " << ((e.what() !=
nullptr)
428 :
"e.what() returned null, sorry")
435 otErr <<
"OTScriptChai::ExecuteScript: Caught exception.\n";
443 #if !defined(OT_USE_CHAI_STDLIB)
445 OTScriptChai::OTScriptChai()
447 , chai(new chaiscript::ChaiScript())
451 OTScriptChai::OTScriptChai(
const OTString& strValue)
453 , chai(new chaiscript::ChaiScript())
457 OTScriptChai::OTScriptChai(
const char* new_string)
458 : OTScript(new_string)
459 , chai(new chaiscript::ChaiScript())
463 OTScriptChai::OTScriptChai(
const char* new_string,
size_t sizeLength)
464 : OTScript(new_string, sizeLength)
465 , chai(new chaiscript::ChaiScript())
469 OTScriptChai::OTScriptChai(
const std::string& new_string)
470 : OTScript(new_string)
471 , chai(new chaiscript::ChaiScript())
477 OTScriptChai::OTScriptChai()
479 , chai(new chaiscript::ChaiScript(chaiscript::Std_Lib::library()))
483 OTScriptChai::OTScriptChai(
const OTString& strValue)
485 , chai(new chaiscript::ChaiScript(chaiscript::Std_Lib::library()))
489 OTScriptChai::OTScriptChai(
const char* new_string)
490 : OTScript(new_string)
491 , chai(new chaiscript::ChaiScript(chaiscript::Std_Lib::library()))
495 OTScriptChai::OTScriptChai(
const char* new_string,
size_t sizeLength)
496 : OTScript(new_string, sizeLength)
497 , chai(new chaiscript::ChaiScript(chaiscript::Std_Lib::library()))
501 OTScriptChai::OTScriptChai(
const std::string& new_string)
502 : OTScript(new_string)
503 , chai(new chaiscript::ChaiScript(chaiscript::Std_Lib::library()))
507 #endif // OT_USE_CHAI_STDLIB
509 OTScriptChai::~OTScriptChai()
511 if (
nullptr != chai)
delete chai;
516 #endif // OT_USE_SCRIPT_CHAI
OTLOG_IMPORT OTLogStream otErr