| 1195 | } |
| 1196 | |
| 1197 | void CrossPointWebServer::handlePostSettings() { |
| 1198 | if (!server->hasArg("plain")) { |
| 1199 | server->send(400, "text/plain", "Missing JSON body"); |
| 1200 | return; |
| 1201 | } |
| 1202 | |
| 1203 | const String body = server->arg("plain"); |
| 1204 | JsonDocument doc; |
| 1205 | const DeserializationError err = deserializeJson(doc, body); |
| 1206 | if (err) { |
| 1207 | server->send(400, "text/plain", String("Invalid JSON: ") + err.c_str()); |
| 1208 | return; |
| 1209 | } |
| 1210 | |
| 1211 | const auto& settings = getSettingsList(&sdFontSystem.registry()); |
| 1212 | int applied = 0; |
| 1213 | |
| 1214 | for (const auto& s : settings) { |
| 1215 | if (!s.key) continue; |
| 1216 | if (!doc[s.key].is<JsonVariant>()) continue; |
| 1217 | |
| 1218 | switch (s.type) { |
| 1219 | case SettingType::TOGGLE: { |
| 1220 | const int val = doc[s.key].as<int>() ? 1 : 0; |
| 1221 | if (s.valuePtr) { |
| 1222 | SETTINGS.*(s.valuePtr) = val; |
| 1223 | } |
| 1224 | applied++; |
| 1225 | break; |
| 1226 | } |
| 1227 | case SettingType::ENUM: { |
| 1228 | const int val = doc[s.key].as<int>(); |
| 1229 | const int maxVal = s.enumStringValues.empty() ? static_cast<int>(s.enumValues.size()) |
| 1230 | : static_cast<int>(s.enumStringValues.size()); |
| 1231 | if (val >= 0 && val < maxVal) { |
| 1232 | if (s.valuePtr) { |
| 1233 | SETTINGS.*(s.valuePtr) = static_cast<uint8_t>(val); |
| 1234 | } else if (s.valueSetter) { |
| 1235 | s.valueSetter(static_cast<uint8_t>(val)); |
| 1236 | } |
| 1237 | applied++; |
| 1238 | } |
| 1239 | break; |
| 1240 | } |
| 1241 | case SettingType::VALUE: { |
| 1242 | const int val = doc[s.key].as<int>(); |
| 1243 | if (val >= s.valueRange.min && val <= s.valueRange.max) { |
| 1244 | if (s.valuePtr) { |
| 1245 | SETTINGS.*(s.valuePtr) = static_cast<uint8_t>(val); |
| 1246 | } |
| 1247 | applied++; |
| 1248 | } |
| 1249 | break; |
| 1250 | } |
| 1251 | case SettingType::STRING: { |
| 1252 | const std::string val = doc[s.key].as<std::string>(); |
| 1253 | if (s.stringSetter) { |
| 1254 | s.stringSetter(val); |
nothing calls this directly
no test coverage detected