From 3dfd1dd1a9e8c149186a213d40618660a4705684 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 16 Jul 2024 14:01:24 +0200 Subject: [PATCH] Lua: Add Json module Change-Id: I533dc63b5147f00ac377e80a338cc4e2e3d0e8d9 Reviewed-by: hjk --- src/plugins/lua/CMakeLists.txt | 4 +++ src/plugins/lua/bindings/json.cpp | 45 +++++++++++++++++++++++++++++++ src/plugins/lua/lua.qbs | 2 ++ src/plugins/lua/luaplugin.cpp | 2 ++ src/plugins/lua/meta/json.lua | 15 +++++++++++ 5 files changed, 68 insertions(+) create mode 100644 src/plugins/lua/bindings/json.cpp create mode 100644 src/plugins/lua/meta/json.lua diff --git a/src/plugins/lua/CMakeLists.txt b/src/plugins/lua/CMakeLists.txt index 71bdb44d8e6..7235e963995 100644 --- a/src/plugins/lua/CMakeLists.txt +++ b/src/plugins/lua/CMakeLists.txt @@ -14,6 +14,7 @@ add_qtc_plugin(Lua bindings/hook.cpp bindings/inheritance.h bindings/install.cpp + bindings/json.cpp bindings/messagemanager.cpp bindings/qtcprocess.cpp bindings/settings.cpp @@ -32,6 +33,7 @@ add_qtc_plugin(Lua meta/documents.lua meta/fetch.lua meta/gui.lua + meta/json.lua meta/install.lua meta/lsp.lua meta/messagemanager.lua @@ -73,6 +75,8 @@ set(META_FILES meta/documents.lua meta/fetch.lua meta/gui.lua + meta/json.lua + meta/localsocket.lua meta/lsp.lua meta/messagemanager.lua meta/process.lua diff --git a/src/plugins/lua/bindings/json.cpp b/src/plugins/lua/bindings/json.cpp new file mode 100644 index 00000000000..1ef45c33650 --- /dev/null +++ b/src/plugins/lua/bindings/json.cpp @@ -0,0 +1,45 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 +#include "../luaengine.h" + +#include +#include + +namespace Lua::Internal { + +void addJsonModule() +{ + LuaEngine::registerProvider("Json", [](sol::state_view lua) -> sol::object { + sol::table json = lua.create_table(); + json["encode"] = [](const sol::table &tbl) -> QString { + QJsonValue value = LuaEngine::toJson(tbl); + QJsonDocument doc; + if (value.isObject()) + doc.setObject(value.toObject()); + else if (value.isArray()) + doc.setArray(value.toArray()); + else + return QString(); + + return QString::fromUtf8(doc.toJson()); + }; + + json["decode"] = [](sol::this_state l, const QString &str) -> sol::table { + QJsonParseError error; + auto doc = QJsonDocument::fromJson(str.toUtf8(), &error); + if (error.error != QJsonParseError::NoError) + throw sol::error(error.errorString().toStdString()); + + if (doc.isObject()) + return LuaEngine::toTable(l.lua_state(), doc.object()); + else if (doc.isArray()) + return LuaEngine::toTable(l.lua_state(), doc.array()); + + return sol::table(); + }; + + return json; + }); +} + +} // namespace Lua::Internal diff --git a/src/plugins/lua/lua.qbs b/src/plugins/lua/lua.qbs index 59156af3d3a..d382a1be09a 100644 --- a/src/plugins/lua/lua.qbs +++ b/src/plugins/lua/lua.qbs @@ -40,6 +40,7 @@ QtcPlugin { "hook.cpp", "inheritance.h", "install.cpp", + "json.cpp" "messagemanager.cpp", "qtcprocess.cpp", "settings.cpp", @@ -69,6 +70,7 @@ QtcPlugin { "fetch.lua", "gui.lua", "install.lua", + "json.lua", "lsp.lua", "messagemanager.lua", "process.lua", diff --git a/src/plugins/lua/luaplugin.cpp b/src/plugins/lua/luaplugin.cpp index 83b8134da45..9ff52293b53 100644 --- a/src/plugins/lua/luaplugin.cpp +++ b/src/plugins/lua/luaplugin.cpp @@ -40,6 +40,7 @@ void addFetchModule(); void addGuiModule(); void addHookModule(); void addInstallModule(); +void addJsonModule(); void addMessageManagerModule(); void addProcessModule(); void addQtModule(); @@ -254,6 +255,7 @@ public: addGuiModule(); addHookModule(); addInstallModule(); + addJsonModule(); addMessageManagerModule(); addProcessModule(); addQtModule(); diff --git a/src/plugins/lua/meta/json.lua b/src/plugins/lua/meta/json.lua new file mode 100644 index 00000000000..3230eba2b36 --- /dev/null +++ b/src/plugins/lua/meta/json.lua @@ -0,0 +1,15 @@ +---@meta Json + +local Json = {} + +---Create a json string representing the table. +---@param table table The table to encode. +---@return string json The JSON string. +function Json.encode(table) end + +---Decode a json string into a table. +---@param json string The JSON string. +---@return table table The decoded table. +function Json.decode(json) end + +return Json