错误处理
This commit is contained in:
@@ -644,15 +644,7 @@ std::string Gallery_Protocol::case_json_from_controls(
|
||||
result["type"] = manual_refresh ? "refresh_state" : "case_state";
|
||||
result["case"] = case_contract(case_id);
|
||||
result["frame_mode"] = frame_mode_contract(frame_mode);
|
||||
try {
|
||||
result["controls"] = Json::parse(controls_json.begin(), controls_json.end());
|
||||
} catch (const std::exception&) {
|
||||
result["controls"] = {
|
||||
{"resources", Json::array()},
|
||||
{"observers", Json::array()},
|
||||
{"render_plan", Json::object()}
|
||||
};
|
||||
}
|
||||
result["controls"] = Json::parse(controls_json.begin(), controls_json.end());
|
||||
result["actions"] = {
|
||||
{"descriptor", adminive::to_descriptor_json<Json, gallery_detail::Action_Model>()},
|
||||
{"view", adminive::to_view_json<Json, gallery_detail::Action_Model>(
|
||||
@@ -662,11 +654,7 @@ std::string Gallery_Protocol::case_json_from_controls(
|
||||
for (const auto& action : gallery_detail::registered_actions(case_id, frame_mode))
|
||||
result["actions"]["data"].push_back(
|
||||
adminive::to_frontend_json<Json>(action));
|
||||
try {
|
||||
result["telemetry"] = Json::parse(telemetry_json.begin(), telemetry_json.end());
|
||||
} catch (const std::exception&) {
|
||||
result["telemetry"] = Json::object();
|
||||
}
|
||||
result["telemetry"] = Json::parse(telemetry_json.begin(), telemetry_json.end());
|
||||
if (!notice.empty())
|
||||
result["notice"] = notice;
|
||||
return result.dump();
|
||||
@@ -690,77 +678,92 @@ std::string Gallery_Protocol::observer_json(std::string_view case_id,
|
||||
result["type"] = "observer_state";
|
||||
result["case_id"] = case_id;
|
||||
result["frame_mode"] = frame_mode_contract(frame_mode);
|
||||
try {
|
||||
result["telemetry"] = Json::parse(telemetry_json.begin(), telemetry_json.end());
|
||||
} catch (const std::exception&) {
|
||||
result["telemetry"] = Json::object();
|
||||
}
|
||||
result["telemetry"] = Json::parse(telemetry_json.begin(), telemetry_json.end());
|
||||
return result.dump();
|
||||
}
|
||||
|
||||
std::optional<Gallery_Open_Request> Gallery_Protocol::open_request(std::string_view message) {
|
||||
Gallery_Request_Result<Gallery_Open_Request> Gallery_Protocol::open_request(std::string_view message) {
|
||||
Json request;
|
||||
try {
|
||||
const Json request = gallery_detail::parse_request(message);
|
||||
if (!request.is_object() || request.value("category", "") != "event" ||
|
||||
request.value("type", "") != "gallery_open" ||
|
||||
!request.contains("case") || !request.at("case").is_string())
|
||||
return std::nullopt;
|
||||
const std::string value = request.at("case").get<std::string>();
|
||||
if (!is_case(value) || !request.contains("frame_mode") ||
|
||||
!request.at("frame_mode").is_string())
|
||||
return std::nullopt;
|
||||
const auto mode = gallery_enum_cast<Gallery_Frame_Mode>(
|
||||
request.at("frame_mode").get<std::string>());
|
||||
return mode ? std::optional<Gallery_Open_Request>(Gallery_Open_Request{value, *mode})
|
||||
: std::nullopt;
|
||||
} catch (const std::exception&) {
|
||||
return std::nullopt;
|
||||
request = gallery_detail::parse_request(message);
|
||||
} catch (const Json::exception&) {
|
||||
return {{}, Gallery_Request_Error::invalid_json};
|
||||
}
|
||||
if (!request.is_object() || !request.contains("category") ||
|
||||
!request.at("category").is_string() ||
|
||||
request.at("category").get_ref<const std::string&>() != "event" ||
|
||||
!request.contains("type") || !request.at("type").is_string() ||
|
||||
request.at("type").get_ref<const std::string&>() != "gallery_open")
|
||||
return {{}, Gallery_Request_Error::wrong_message_type};
|
||||
if (!request.contains("case") || !request.contains("frame_mode"))
|
||||
return {{}, Gallery_Request_Error::missing_field};
|
||||
if (!request.at("case").is_string() || !request.at("frame_mode").is_string())
|
||||
return {{}, Gallery_Request_Error::invalid_field};
|
||||
const std::string value = request.at("case").get<std::string>();
|
||||
const auto mode = gallery_enum_cast<Gallery_Frame_Mode>(
|
||||
request.at("frame_mode").get_ref<const std::string&>());
|
||||
if (!is_case(value) || !mode)
|
||||
return {{}, Gallery_Request_Error::invalid_field};
|
||||
return {Gallery_Open_Request{value, *mode}, Gallery_Request_Error::none};
|
||||
}
|
||||
|
||||
std::optional<Gallery_Action_Request> Gallery_Protocol::action_request(
|
||||
Gallery_Request_Result<Gallery_Action_Request> Gallery_Protocol::action_request(
|
||||
std::string_view message) {
|
||||
Json request;
|
||||
try {
|
||||
const Json request = gallery_detail::parse_request(message);
|
||||
if (!request.is_object() || request.value("category", "") != "event" ||
|
||||
request.value("type", "") != "gallery_action" ||
|
||||
!request.contains("action") || !request.at("action").is_string())
|
||||
return std::nullopt;
|
||||
Gallery_Action_Request result{request.at("action").get<std::string>()};
|
||||
if (request.contains("argument")) {
|
||||
const Json& argument = request.at("argument");
|
||||
if (argument.is_boolean())
|
||||
result.argument = argument.get<bool>();
|
||||
else if (argument.is_number()) {
|
||||
const double value = argument.get<double>();
|
||||
if (!std::isfinite(value))
|
||||
return std::nullopt;
|
||||
result.argument = value;
|
||||
} else if (argument.is_string())
|
||||
result.argument = argument.get<std::string>();
|
||||
else
|
||||
return std::nullopt;
|
||||
}
|
||||
return result;
|
||||
} catch (const std::exception&) {
|
||||
return std::nullopt;
|
||||
request = gallery_detail::parse_request(message);
|
||||
} catch (const Json::exception&) {
|
||||
return {{}, Gallery_Request_Error::invalid_json};
|
||||
}
|
||||
if (!request.is_object() || !request.contains("category") ||
|
||||
!request.at("category").is_string() ||
|
||||
request.at("category").get_ref<const std::string&>() != "event" ||
|
||||
!request.contains("type") || !request.at("type").is_string() ||
|
||||
request.at("type").get_ref<const std::string&>() != "gallery_action")
|
||||
return {{}, Gallery_Request_Error::wrong_message_type};
|
||||
if (!request.contains("action"))
|
||||
return {{}, Gallery_Request_Error::missing_field};
|
||||
if (!request.at("action").is_string())
|
||||
return {{}, Gallery_Request_Error::invalid_field};
|
||||
Gallery_Action_Request result{request.at("action").get<std::string>()};
|
||||
if (request.contains("argument")) {
|
||||
const Json& argument = request.at("argument");
|
||||
if (argument.is_boolean())
|
||||
result.argument = argument.get<bool>();
|
||||
else if (argument.is_number()) {
|
||||
const double value = argument.get<double>();
|
||||
if (!std::isfinite(value))
|
||||
return {{}, Gallery_Request_Error::invalid_field};
|
||||
result.argument = value;
|
||||
} else if (argument.is_string())
|
||||
result.argument = argument.get<std::string>();
|
||||
else
|
||||
return {{}, Gallery_Request_Error::invalid_field};
|
||||
}
|
||||
return {std::move(result), Gallery_Request_Error::none};
|
||||
}
|
||||
|
||||
std::optional<Gallery_Control_Patch_Request> Gallery_Protocol::control_patch_request(
|
||||
Gallery_Request_Result<Gallery_Control_Patch_Request> Gallery_Protocol::control_patch_request(
|
||||
std::string_view message) {
|
||||
Json request;
|
||||
try {
|
||||
const Json request = gallery_detail::parse_request(message);
|
||||
if (!request.is_object() || request.value("category", "") != "event" ||
|
||||
request.value("type", "") != "gallery_patch" ||
|
||||
!request.contains("target") || !request.at("target").is_string() ||
|
||||
!request.contains("patch") || !request.at("patch").is_object())
|
||||
return std::nullopt;
|
||||
return Gallery_Control_Patch_Request{
|
||||
request.at("target").get<std::string>(), request.at("patch").dump()};
|
||||
} catch (const std::exception&) {
|
||||
return std::nullopt;
|
||||
request = gallery_detail::parse_request(message);
|
||||
} catch (const Json::exception&) {
|
||||
return {{}, Gallery_Request_Error::invalid_json};
|
||||
}
|
||||
if (!request.is_object() || !request.contains("category") ||
|
||||
!request.at("category").is_string() ||
|
||||
request.at("category").get_ref<const std::string&>() != "event" ||
|
||||
!request.contains("type") || !request.at("type").is_string() ||
|
||||
request.at("type").get_ref<const std::string&>() != "gallery_patch")
|
||||
return {{}, Gallery_Request_Error::wrong_message_type};
|
||||
if (!request.contains("target") || !request.contains("patch"))
|
||||
return {{}, Gallery_Request_Error::missing_field};
|
||||
if (!request.at("target").is_string() || !request.at("patch").is_object())
|
||||
return {{}, Gallery_Request_Error::invalid_field};
|
||||
return {Gallery_Control_Patch_Request{
|
||||
request.at("target").get<std::string>(), request.at("patch").dump()},
|
||||
Gallery_Request_Error::none};
|
||||
}
|
||||
|
||||
bool Gallery_Protocol::action_available(std::string_view case_id,
|
||||
|
||||
Reference in New Issue
Block a user