-
Notifications
You must be signed in to change notification settings - Fork 0
/
MacroRunner.cpp
98 lines (90 loc) · 2.71 KB
/
MacroRunner.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "MacroRunner.h"
#include "Beep.h"
#include "General.h"
#include "Log.h"
#include "PollingProject.h"
struct Instruction {
enum class Type {
None,
CollectPolls,
PrepareModel,
RunModel,
SetNowcast,
RunProjection,
RunSimulation
};
Instruction(Type type, int id) : type(type), id(id) {}
Type type;
int id;
};
MacroRunner::MacroRunner(PollingProject& project)
: project_(project)
{
}
std::optional<std::string> MacroRunner::run(std::string macro, bool /*confirmId*/)
{
logger << "Running macro: reading instructions\n";
auto lines = splitString(macro, ";");
std::vector<Instruction> instructions;
for (auto const& line : lines) {
auto parts = splitString(line, ":");
if (parts.size() != 2) return "Error: not exactly 2 parts to this line - " + line;
int id = -1;
try {
id = std::stoi(parts[1]);
}
catch (std::invalid_argument) {
return "Error: 2nd part did not correspond to an integer - " + line;
}
if (id < 0) {
return "Error: Invalid ID - " + line;
}
Instruction::Type type = Instruction::Type::None;
if (parts[0] == "collect-polls") {
type = Instruction::Type::CollectPolls;
}
else if (parts[0] == "prepare-model") {
type = Instruction::Type::PrepareModel;
}
else if (parts[0] == "run-model") {
type = Instruction::Type::RunModel;
}
else if (parts[0] == "set-nowcast") {
type = Instruction::Type::SetNowcast;
}
else if (parts[0] == "run-projection") {
type = Instruction::Type::RunProjection;
}
else if (parts[0] == "run-simulation") {
type = Instruction::Type::RunSimulation;
}
if (type == Instruction::Type::None) {
return "Error: Invalid instruction - " + line;
}
instructions.push_back(Instruction(type, id));
}
logger << "Running macro: reading instructions successful, now executing\n";
for (auto instruction : instructions) {
if (instruction.type == Instruction::Type::CollectPolls) {
project_.polls().collectPolls();
}
else if (instruction.type == Instruction::Type::PrepareModel) {
project_.models().access(instruction.id).prepareForRun([](std::string s) {});
}
else if (instruction.type == Instruction::Type::RunModel) {
project_.models().access(instruction.id).loadData([](std::string s) {},
project_.config().getModelThreads());
}
else if (instruction.type == Instruction::Type::SetNowcast) {
project_.projections().access(instruction.id).setAsNowCast(project_.models());
}
else if (instruction.type == Instruction::Type::RunProjection) {
project_.projections().run(instruction.id);
}
else if (instruction.type == Instruction::Type::RunSimulation) {
project_.simulations().run(instruction.id);
}
}
if (project_.config().getBeepOnCompletion()) beep();
return std::optional<std::string>();
}