/* Serialise Lua data into JSON string. */ static void json_append_data(lua_State *l, struct luaL_serializer *cfg, int current_depth, strbuf_t *json) { struct luaL_field field; luaL_checkfield(l, cfg, -1, &field); switch (field.type) { case MP_UINT: return json_append_uint(cfg, json, field.ival); case MP_STR: case MP_BIN: return json_append_string(cfg, json, field.sval.data, field.sval.len); case MP_INT: return json_append_int(cfg, json, field.ival); case MP_FLOAT: return json_append_number(cfg, json, field.fval); case MP_DOUBLE: return json_append_number(cfg, json, field.dval); case MP_BOOL: if (field.bval) strbuf_append_mem(json, "true", 4); else strbuf_append_mem(json, "false", 5); break; case MP_NIL: json_append_nil(cfg, json); break; case MP_MAP: if (current_depth >= cfg->encode_max_depth) return json_append_nil(cfg, json); /* Limit nested maps */ json_append_object(l, cfg, current_depth, json); return; case MP_ARRAY: /* Array */ if (current_depth >= cfg->encode_max_depth) return json_append_nil(cfg, json); /* Limit nested arrays */ json_append_array(l, cfg, current_depth, json, field.size); return; case MP_EXT: /* handled by luaL_convertfield */ assert(false); return; } }
/* Serialise Lua data into JSON string. */ static void json_append_data(lua_State *l, json_config_t *cfg, int current_depth, strbuf_t *json) { int len; switch (lua_type(l, -1)) { case LUA_TSTRING: json_append_string(l, json, -1); break; case LUA_TNUMBER: json_append_number(l, cfg, json, -1); break; case LUA_TBOOLEAN: if (lua_toboolean(l, -1)) strbuf_append_mem(json, "true", 4); else strbuf_append_mem(json, "false", 5); break; case LUA_TTABLE: current_depth++; json_check_encode_depth(l, cfg, current_depth, json); len = lua_array_length(l, cfg, json); if (len > 0) json_append_array(l, cfg, current_depth, json, len); else json_append_object(l, cfg, current_depth, json); break; case LUA_TNIL: strbuf_append_mem(json, "null", 4); break; case LUA_TLIGHTUSERDATA: if (lua_touserdata(l, -1) == NULL) { strbuf_append_mem(json, "null", 4); break; } default: /* Remaining types (LUA_TFUNCTION, LUA_TUSERDATA, LUA_TTHREAD, * and LUA_TLIGHTUSERDATA) cannot be serialised */ json_encode_exception(l, cfg, json, -1, "type not supported"); /* never returns */ } }