diff vamp-json/VampJson.h @ 184:150cfa0c71e1

Merge pull request #1 from piper-audio/fix/regression-json-responses Fix/regression json responses
author Chris Cannam <cannam@all-day-breakfast.com>
date Fri, 03 Feb 2017 13:00:42 +0000
parents 03b067abd91d
children 3eb00e5c76c4
line wrap: on
line diff
--- a/vamp-json/VampJson.h	Tue Jan 31 18:05:11 2017 +0000
+++ b/vamp-json/VampJson.h	Fri Feb 03 13:00:42 2017 +0000
@@ -305,7 +305,7 @@
             return {};
         }
 
-        od = toConfiguredOutputDescriptor(j, err);
+        od = toConfiguredOutputDescriptor(j["configured"], err);
         if (failed(err)) return {};
     
         toBasicDescriptor(j["basic"], od, err);
@@ -849,7 +849,7 @@
     toListResponse(json11::Json j, std::string &err) {
 
         ListResponse resp;
-        for (const auto &a: j["result"]["available"].array_items()) {
+        for (const auto &a: j["available"].array_items()) {
             resp.available.push_back(toPluginStaticData(a, err));
             if (failed(err)) return {};
         }
@@ -1109,11 +1109,19 @@
 
     static bool
     successful(json11::Json j, std::string &err) {
-        if (!j["success"].is_bool()) {
-            err = "bool expected for success";
+        const bool hasResult = j["result"].is_object();
+        const bool hasError = j["error"].is_object();
+        if (hasResult && hasError) {
+            err = "valid response may contain only one of result and error objects";
             return false;
+        } else if (hasError) {
+            return false;
+        } else if (!hasResult) {
+            err = "either a result or an error object is required for a valid response";
+            return false;
+        } else {
+            return true;
         }
-        return j["success"].bool_value();
     }
 
     static void
@@ -1298,7 +1306,8 @@
     static json11::Json
     fromError(std::string errorText,
               RRType responseType,
-              const json11::Json &id) {
+              const json11::Json &id,
+              bool writeVerbatimError = false) {
 
         json11::Json::object jo;
         markRPC(jo);
@@ -1315,7 +1324,7 @@
         json11::Json::object eo;
         eo["code"] = 0;
 
-        if (responseType == RRType::NotValid) {
+        if (responseType == RRType::NotValid || writeVerbatimError) {
             eo["message"] = errorText;
         } else {
             eo["message"] =