about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/value-to-json.cc19
-rw-r--r--src/libexpr/value-to-json.hh50
2 files changed, 56 insertions, 13 deletions
diff --git a/src/libexpr/value-to-json.cc b/src/libexpr/value-to-json.cc
index 671a3c119741..a2004df5c8c5 100644
--- a/src/libexpr/value-to-json.cc
+++ b/src/libexpr/value-to-json.cc
@@ -1,5 +1,4 @@
-#include "value-to-xml.hh"
-#include "xml-writer.hh"
+#include "value-to-json.hh"
 #include "eval-inline.hh"
 #include "util.hh"
 
@@ -9,7 +8,7 @@
 namespace nix {
 
 
-static void escapeJSON(std::ostream & str, const string & s)
+void escapeJSON(std::ostream & str, const string & s)
 {
     str << "\"";
     foreach (string::const_iterator, i, s)
@@ -55,32 +54,26 @@ void printValueAsJSON(EvalState & state, bool strict,
         case tAttrs: {
             Bindings::iterator i = v.attrs->find(state.sOutPath);
             if (i == v.attrs->end()) {
-                str << "{";
+                JSONObject json(str);
                 StringSet names;
                 foreach (Bindings::iterator, i, *v.attrs)
                     names.insert(i->name);
-                bool first = true;
                 foreach (StringSet::iterator, i, names) {
-                    if (!first) str << ","; else first = false;
                     Attr & a(*v.attrs->find(state.symbols.create(*i)));
-                    escapeJSON(str, *i);
-                    str << ":";
+                    json.attr(*i);
                     printValueAsJSON(state, strict, *a.value, str, context);
                 }
-                str << "}";
             } else
                 printValueAsJSON(state, strict, *i->value, str, context);
             break;
         }
 
         case tList: {
-            str << "[";
-            bool first = true;
+            JSONList json(str);
             for (unsigned int n = 0; n < v.list.length; ++n) {
-                if (!first) str << ","; else first = false;
+                json.elem();
                 printValueAsJSON(state, strict, *v.list.elems[n], str, context);
             }
-            str << "]";
             break;
         }
 
diff --git a/src/libexpr/value-to-json.hh b/src/libexpr/value-to-json.hh
index 5f36a76d8a7e..e3a97efe4269 100644
--- a/src/libexpr/value-to-json.hh
+++ b/src/libexpr/value-to-json.hh
@@ -11,4 +11,54 @@ namespace nix {
 void printValueAsJSON(EvalState & state, bool strict,
     Value & v, std::ostream & out, PathSet & context);
 
+void escapeJSON(std::ostream & str, const string & s);
+
+struct JSONObject
+{
+    std::ostream & str;
+    bool first;
+    JSONObject(std::ostream & str) : str(str), first(true)
+    {
+        str << "{";
+    }
+    ~JSONObject()
+    {
+        str << "}";
+    }
+    void attr(const string & s)
+    {
+        if (!first) str << ","; else first = false;
+        escapeJSON(str, s);
+        str << ":";
+    }
+    void attr(const string & s, const string & t)
+    {
+        attr(s);
+        escapeJSON(str, t);
+    }
+};
+
+struct JSONList
+{
+    std::ostream & str;
+    bool first;
+    JSONList(std::ostream & str) : str(str), first(true)
+    {
+        str << "[";
+    }
+    ~JSONList()
+    {
+        str << "]";
+    }
+    void elem()
+    {
+        if (!first) str << ","; else first = false;
+    }
+    void elem(const string & s)
+    {
+        elem();
+        escapeJSON(str, s);
+    }
+};
+
 }