#include "Parser.hpp"
#include "EvaluationContext.hpp"
#include "Evaluator.hpp"
+#include "../ActivityFactory.hpp"
+#include "../Observer.hpp"
#include "../UIElement.hpp"
#include "../NavigationInterface.hpp"
return result;
}
};
+ for (auto activityName : ActivityFactory::getInstance()->getAllActivityTypes()) {
+ variables[activityName] = EvaluationValue::FunctionType::Type{
+ [ = ](EvaluationContext & ec, std::vector<EvaluationValue> args) -> EvaluationValue {
+ executeOnMainThread([&]()
+ {
+ DEBUG("calling activity %s", activityName.c_str());
+ auto activity = ActivityFactory::getInstance()->createActivity(activityName);
+ if (!activity)
+ throw EvaluationFailure{} << "failed to construct '" << activityName << "' activity";
+ auto numOfArgs = activity->getRequiredNumberOfArgumentsIfAllowedInBatchProcessing();
+ if (!numOfArgs)
+ throw EvaluationFailure{} << "activity '" << activityName << "' is not supported";
+ if (*numOfArgs != args.size())
+ throw EvaluationFailure{} << "invalid number of arguments for activity '" << activityName <<
+ "', got " << args.size() << ", expected " << *numOfArgs;
+ auto activityObserver = std::dynamic_pointer_cast<Observer<UIElement>>(activity);
+ for (size_t i = 0; i < args.size(); ++i) {
+ ASSERT(activityObserver);
+ auto uiElement = detail::ConvertTo<std::shared_ptr<UIElement>>::convert(ec, std::move(args[i]));
+ if (!uiElement)
+ throw EvaluationFailure{} << "can't convert argument " << (i + 1) <<
+ " of kind " << EvaluationValue::toString(args[i].kind()) << " to UIElement";
+ activityObserver->update(std::move(uiElement));
+ }
+ activity->process({});
+ if (!activity->isCompleted())
+ throw EvaluationFailure{} << "not enough arguments for activity '" << activityName << "'";
+ DEBUG("calling activity %s done", activityName.c_str());
+ });
+ return {};
+ } };
+ }
+
auto nav = Singleton<UniversalSwitch>::instance().getNavigationInterface();
this->navigationContext = nav->getCurrentNavigationContext();
this->root = nav->getCurrentVisibleRoot();