-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathconsole.cc
64 lines (52 loc) · 1.7 KB
/
console.cc
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
#include "console.h"
#include <functional>
namespace felis {
std::map<std::string, std::function<json11::Json (Console *, json11::Json)>> g_handlers;
Console::Console()
{
g_handlers["status_change"] = &Console::HandleStatusChange;
g_handlers["get_status"] = &Console::HandleGetStatus;
}
static const auto kJsonResponseError = json11::Json::object({
{"type", "error"},
});
json11::Json Console::HandleJsonAPI(const json11::Json &j)
{
auto pair = j.object_items().find("type");
if (pair == j.object_items().end())
return kJsonResponseError;
auto req_type = pair->second.string_value();
auto it = g_handlers.find(req_type);
if (it != g_handlers.end()) {
return it->second(this, j);
} else {
return kJsonResponseError;
}
}
static const std::string kStatusNames[] = {
"booting", "configuring", "listening", "connecting", "running", "exiting",
};
static const size_t kNrStatusNames = 6;
json11::Json Console::HandleStatusChange(const json11::Json &j)
{
std::string propsed_status = j.object_items().find("status")->second.string_value();
auto it = std::find(kStatusNames, kStatusNames + kNrStatusNames, propsed_status);
if (it == kStatusNames + kNrStatusNames) {
return kJsonResponseError;
}
// Since we are configuring, we just overwrite the entire configuration.
if (propsed_status == "configuring")
conf = j;
auto status = (Console::ServerStatus) ((int) (it - kStatusNames));
UpdateServerStatus(status);
return JsonResponse();
}
json11::Json Console::HandleGetStatus(const json11::Json &j)
{
if (server_status < kNrStatusNames) {
std::string status = kStatusNames[server_status];
return JsonResponse({{"status", status}});
}
return kJsonResponseError;
}
}