Value Compiler::ExeFor::Eval(ExeContext& x) const { LTIMING("ExeFor"); Value array = value->Eval(x); LLOG("ExeFor array: " << array); if(array.GetCount() == 0 && onempty) return onempty->Eval(x); ValueMap m; bool map = array.Is<ValueMap>(); if(map) m = array; int q = x.stack.GetCount(); x.stack.Add(); x.stack.Add(); for(int i = 0; i < array.GetCount(); i++) { x.stack[q] = array[i]; LoopInfo f; f.first = i == 0; f.last = i == array.GetCount() - 1; f.index = i; f.key = map ? m.GetKeys()[i] : (Value)i; x.stack[q + 1] = RawToValue(f); sCatAsString(x.out, body->Eval(x)); } x.stack.SetCount(q); return Value(); }
String FormatXmlRpcValue(const Value& _v) { String r; Value v = _v; if(v.GetType() == INT64_V) { int64 x = v; if((int)x == x) v = (int)x; } if(IsNull(v) && !IsString(v) && !IsValueArray(v)) r = XmlTag("nil")(); else if(v.GetType() == INT_V) r = XmlTag("int")(Format("%d", (int)v)); else if(v.GetType() == BOOL_V) r = XmlTag("boolean")(AsString((int)(bool)v)); else if(IsNumber(v)) r = XmlTag("double")(Format("%.16g", (double)v)); else if(IsDateTime(v)) { Time t = v; r = XmlTag("dateTime.iso8601") (Format("%04.4d%02.2d%02.2d`T%02.2d`:%02.2d`:%02.2d", t.year, t.month, t.day, t.hour, t.minute, t.second)); } else if(v.GetType() == VALUEMAP_V) { r = "<struct>"; ValueMap vm = v; const Index<Value>& k = vm.GetKeys(); ValueArray va = vm.GetValues(); for(int i = 0; i < k.GetCount(); i++) r << XmlTag("member")(XmlTag("name")(k[i]) + FormatXmlRpcValue(va[i])); r << "</struct>"; } else if(v.GetType() == VALUEARRAY_V) { r = "<array><data>"; ValueArray va = v; for(int i = 0; i < va.GetCount(); i++) r << FormatXmlRpcValue(va[i]); r << "</data></array>"; } else if(v.Is<RawJsonText>()) r = XmlTag("string").Text(v.To<RawJsonText>().json); else r = XmlTag("string").Text(v); return XmlTag("value")(r); }
String AsJSON(const Value& v, const String& sep, bool pretty) { String r; if(v.GetType() == VALUEMAP_V) { r << "{"; String sep1; if(pretty) { r << "\r\n"; sep1 = sep + '\t'; } ValueMap m = v; ValueArray va = m.GetValues(); for(int i = 0; i < m.GetCount(); i++) { if(i) { r << ","; if(pretty) r << "\r\n"; } if(pretty) r << sep1; r << AsCString((String)m.GetKeys()[i]) << (pretty ? ": " : ":") << AsJSON(va[i], sep1, pretty); } if(pretty) r << "\r\n" << sep; r << "}"; return r; } if(v.GetType() == VALUEARRAY_V) { r << "["; String sep1; if(pretty) { r << "\r\n"; sep1 = sep + '\t'; } ValueArray va = v; for(int i = 0; i < va.GetCount(); i++) { if(i) { r << ","; if(pretty) r << "\r\n"; } if(pretty) r << sep1; r << AsJSON(va[i], sep1, pretty); } if(pretty) r << "\r\n" << sep; r << "]"; return r; } if(IsNumber(v) && IsNull(v)) return "null"; if(v.GetType() == INT_V) return Format("%d", (int)v); if(v.GetType() == BOOL_V) return (bool)v ? "true" : "false"; if(IsNumber(v)) return Format("%.16g", (double)v); if(IsString(v)) return AsCString((String)v); if(IsNull(v)) return "null"; NEVER(); return "null"; }