summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/lua.rst8
-rw-r--r--player/lua.c18
2 files changed, 26 insertions, 0 deletions
diff --git a/DOCS/man/lua.rst b/DOCS/man/lua.rst
index 4700b90cb2..ff70600a1d 100644
--- a/DOCS/man/lua.rst
+++ b/DOCS/man/lua.rst
@@ -639,6 +639,14 @@ strictly part of the guaranteed API.
trailing text is returned as 3rd return value. (The 3rd return value is
always there, but with ``trail`` set, no error is raised.)
+``utils.format_json(v)``
+ Format the given Lua table (or value) as a JSON string and return it. On
+ error, returns ``nil, error``. (Errors usually only happen on value types
+ incompatible with JSON.)
+
+ The argument value uses similar conventions as ``mp.set_property_native()``
+ to distinguish empty objects and arrays.
+
``utils.to_string(v)``
Turn the given value into a string. Formats tables and their contents. This
doesn't do anything special; it is only needed because Lua is terrible.
diff --git a/player/lua.c b/player/lua.c
index 51c0e1a752..4ef772fd84 100644
--- a/player/lua.c
+++ b/player/lua.c
@@ -1255,6 +1255,23 @@ static int script_parse_json(lua_State *L)
return 3;
}
+static int script_format_json(lua_State *L)
+{
+ void *tmp = mp_lua_PITA(L);
+ struct mpv_node node;
+ makenode(tmp, &node, L, 1);
+ char *dst = talloc_strdup(tmp, "");
+ if (json_write(&dst, &node) >= 0) {
+ lua_pushstring(L, dst);
+ lua_pushnil(L);
+ } else {
+ lua_pushnil(L);
+ lua_pushstring(L, "error");
+ }
+ talloc_free_children(tmp);
+ return 2;
+}
+
#define FN_ENTRY(name) {#name, script_ ## name}
struct fn_entry {
const char *name;
@@ -1303,6 +1320,7 @@ static const struct fn_entry utils_fns[] = {
FN_ENTRY(join_path),
FN_ENTRY(subprocess),
FN_ENTRY(parse_json),
+ FN_ENTRY(format_json),
{0}
};