33 const nlohmann::json& value) {
35 return absl::InvalidArgumentError(
"Invalid sprite asset binding v1");
38 if (!value.is_object() || !value.at(
"version").is_number_integer())
40 const bool behavior_version = value.at(
"version") == 2;
41 if ((!behavior_version && value.at(
"version") != 1) ||
42 value.size() != (behavior_version ? 10 : 9))
45 if (behavior_version) {
48 return behavior.status();
49 asset.
behavior = std::move(*behavior);
51 asset.
zsm_path = value.at(
"zsm_path").get<std::string>();
52 asset.
catalog_key = value.at(
"catalog_key").get<std::string>();
53 asset.
draw_adapter = value.at(
"draw_adapter").get<std::string>();
54 asset.
source_path = value.at(
"source_path").get<std::string>();
55 asset.
source_label = value.at(
"source_label").get<std::string>();
56 asset.
source_sha256 = value.at(
"source_sha256").get<std::string>();
58 asset.
zsm_path.find(
'\0') != std::string::npos ||
70 const auto& sheets = value.at(
"sheets");
71 const auto& rows = value.at(
"palette_rows");
72 if (!sheets.is_array() || sheets.size() != 8 || !rows.is_array() ||
75 for (
size_t i = 0; i < 8; ++i) {
76 if (!sheets[i].is_number_integer() || sheets[i] < 0 || sheets[i] > 255)
78 asset.
sheets[i] = sheets[i].get<
int>();
79 if (!rows[i].is_object() || rows[i].size() != 2 ||
80 !rows[i].at(
"index").is_number_integer() || rows[i].at(
"index") < 0 ||
81 rows[i].at(
"index") > 255)
84 row.group = rows[i].at(
"group").get<std::string>();
85 row.index = rows[i].at(
"index").get<
int>();
86 if (row.group !=
"auto" && row.group !=
"global_sprites" &&
87 row.group !=
"sprites_aux1" && row.group !=
"sprites_aux2" &&
88 row.group !=
"sprites_aux3")
92 }
catch (
const nlohmann::json::exception&) {
98 const std::string& text) {
99 if (text.size() > 65536)
100 return absl::ResourceExhaustedError(
"Sprite asset binding exceeds 64 KiB");
102 std::vector<std::set<std::string>> keys;
103 auto value = nlohmann::json::parse(
104 text, [&](
int depth, nlohmann::json::parse_event_t event,
105 nlohmann::json& node) {
107 throw std::runtime_error(
"Sprite asset nesting exceeds limit");
108 if (event == nlohmann::json::parse_event_t::object_start)
110 else if (event == nlohmann::json::parse_event_t::key) {
111 if (!keys.back().insert(node.get<std::string>()).second)
112 throw std::runtime_error(
"Duplicate sprite asset field");
113 }
else if (event == nlohmann::json::parse_event_t::object_end)
118 }
catch (
const std::exception& e) {
119 return absl::InvalidArgumentError(e.what());