Refactor JSON output
This commit is contained in:
		
							parent
							
								
									77c13cdf56
								
							
						
					
					
						commit
						5fea98111b
					
				
					 2 changed files with 56 additions and 13 deletions
				
			
		|  | @ -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; | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue