static bool RenderVariable(Writer *out, const char *content, size_t content_len, bool escaped, Seq *hash_stack) { JsonElement *var = NULL; if (strncmp(content, ".", content_len) == 0) { var = SeqAt(hash_stack, SeqLength(hash_stack) - 1); } else { var = LookupVariable(hash_stack, content, content_len); } if (!var) { return true; } switch (JsonGetElementType(var)) { case JSON_ELEMENT_TYPE_PRIMITIVE: return RenderVariablePrimitive(out, var, escaped); case JSON_ELEMENT_TYPE_CONTAINER: assert(false); return false; } assert(false); return false; }
static bool RenderVariable(Buffer *out, const char *content, size_t content_len, TagType conversion, Seq *hash_stack) { JsonElement *var = NULL; bool escape = conversion == TAG_TYPE_VAR; bool serialize = conversion == TAG_TYPE_VAR_SERIALIZED; bool serialize_compact = conversion == TAG_TYPE_VAR_SERIALIZED_COMPACT; const bool item_mode = strncmp(content, ".", content_len) == 0; const bool key_mode = strncmp(content, "@", content_len) == 0; if (item_mode || key_mode) { var = SeqAt(hash_stack, SeqLength(hash_stack) - 1); } else { var = LookupVariable(hash_stack, content, content_len); } if (!var) { return true; } switch (JsonGetElementType(var)) { case JSON_ELEMENT_TYPE_PRIMITIVE: // note that this also covers 'serialize' on primitives return RenderVariablePrimitive(out, var, escape, key_mode); case JSON_ELEMENT_TYPE_CONTAINER: if (serialize || serialize_compact) { return RenderVariableContainer(out, var, serialize_compact); } else { assert(false); return false; } } assert(false); return false; }