From 5fea98111b3cd9b94ed1ebe89953a7757d6d3a69 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 19 Nov 2013 00:33:06 +0100 Subject: [PATCH] Refactor JSON output --- src/libexpr/value-to-json.cc | 19 +++++--------- src/libexpr/value-to-json.hh | 50 ++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/libexpr/value-to-json.cc b/src/libexpr/value-to-json.cc index 671a3c119..a2004df5c 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 5f36a76d8..e3a97efe4 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); + } +}; + }