From 89f459fc2e4653683b18388c21b74af89f2219ae Mon Sep 17 00:00:00 2001 From: Folke Lemaitre Date: Thu, 8 Sep 2022 13:12:24 +0200 Subject: [PATCH] feat: simple method to generate a json schema based on a lua table --- lua/lsp-settings/schema.lua | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 lua/lsp-settings/schema.lua diff --git a/lua/lsp-settings/schema.lua b/lua/lsp-settings/schema.lua new file mode 100644 index 0000000..f44b4e7 --- /dev/null +++ b/lua/lsp-settings/schema.lua @@ -0,0 +1,40 @@ +local M = {} + +-- try to create a simple schema from a given value +function M.to_schema(value) + if value == nil then + return { type = "null" } + elseif type(value) == "boolean" then + return { type = "boolean", default = value, description = "boolean" } + elseif type(value) == "string" then + return { type = "string", default = value, description = "string" } + elseif type(value) == "number" then + return { type = "number", default = value, description = "number" } + end + + if vim.tbl_islist(value) then + return { type = "array", default = value, description = "array" } + end + + if type(value) == "table" then + local obj = { type = "object", properties = {} } + for k, v in pairs(value) do + obj.properties[k] = M.to_schema(v) + end + return obj + end + return { type = "null" } +end + +function M.plugin_schema(name, obj, description) + local schema = M.to_schema(obj) + schema.description = description + return { + type = "object", + properties = { + [name] = schema, + }, + } +end + +return M