116 {
118 *err = "v2 'segments' is not an array";
119 return false;
120 }
121
122 auto arrPtr = segmentsArr.
as_array();
123 if (!arrPtr) {
124 *err = "v2 'segments' array could not be read";
125 return false;
126 }
127
128 for (const auto& elem : *arrPtr) {
129 if (!elem) {
130 *err = "v2 segment is null";
131 return false;
132 }
133 fl::json segVal(elem);
134 if (!segVal.has_value() || !segVal.is_object()) {
135 *err = "v2 segment is not an object";
136 return false;
137 }
138
139
140 if (!segVal.contains("id") || !segVal["id"].has_value()) {
141 *err = "v2 segment missing 'id'";
142 return false;
143 }
144 auto idOpt = segVal["id"].as_string();
145 if (!idOpt) {
146 *err = "v2 segment 'id' is not a string";
147 return false;
148 }
149 string id = *idOpt;
150
151
152 if (!segVal.contains("x") || !segVal["x"].has_value() || !segVal["x"].is_array()) {
153 *err = "v2 segment '" + id + "' missing or invalid 'x' array";
154 return false;
155 }
157
158
159 if (!segVal.contains("y") || !segVal["y"].has_value() || !segVal["y"].is_array()) {
160 *err = "v2 segment '" + id + "' missing or invalid 'y' array";
161 return false;
162 }
164
165
166
167
168 float diameter = -1.0f;
169 if (segVal.contains("diameter") && segVal["diameter"].has_value()) {
170 auto diameterOpt = segVal["diameter"].as_float();
171 if (diameterOpt) {
172 diameter = static_cast<float>(*diameterOpt);
173 }
174 }
175
178 for (size_t i = 0; i < n; i++) {
179 segment_map.set(i,
vec2f{x_array[i], y_array[i]});
180 }
181 (*segmentMaps)[id] =
fl::move(segment_map);
182 }
183 return true;
184}
const json_array * as_array() const FL_NOEXCEPT
bool is_array() const FL_NOEXCEPT
bool has_value() const FL_NOEXCEPT
fl::size size() const FL_NOEXCEPT
constexpr remove_reference< T >::type && move(T &&t) FL_NOEXCEPT
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NOEXCEPT
fl::vector< float > jsonArrayToFloatVector(const fl::json &jsonArray)