summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--script/client.lua48
-rw-r--r--script/json-edit.lua63
2 files changed, 66 insertions, 45 deletions
diff --git a/script/client.lua b/script/client.lua
index a4f9cdb8..ea80ee53 100644
--- a/script/client.lua
+++ b/script/client.lua
@@ -225,21 +225,19 @@ end
---@class json.patch
---@field op 'add' | 'remove' | 'replace' | 'move' | 'copy' | 'test'
---@field path string
----@field data any
+---@field value any
---@param cfg table
---@param change config.change
---@return json.patch?
local function makeConfigPatch(cfg, change)
- local value = cfg[change.key]
- local parent = cfg
- local parentKey = ''
+ local value = cfg[change.key]
if change.action == 'add' then
if type(value) == 'table' and #cfg[change.key] > 0 then
return {
- op = 'add',
- path = '/' .. change.key .. '/-',
- data = change.value,
+ op = 'add',
+ path = '/' .. change.key .. '/-',
+ value = change.value,
}
else
return makeConfigPatch(cfg, {
@@ -249,35 +247,25 @@ local function makeConfigPatch(cfg, change)
})
end
elseif change.action == 'set' then
- if next(parent) then
- if value ~= nil then
- return {
- op = 'replace',
- path = '/' .. change.key,
- data = change.value,
- }
- else
- return {
- op = 'add',
- path = '/' .. change.key,
- data = change.value,
- }
- end
+ if value ~= nil then
+ return {
+ op = 'replace',
+ path = '/' .. change.key,
+ value = change.value,
+ }
else
- -- TODO: workaround, json-edit cannot edit an empty object
return {
- op = 'add',
- path = parentKey,
- data = { [change.key] = change.value },
+ op = 'add',
+ path = '/' .. change.key,
+ value = change.value,
}
end
elseif change.action == 'prop' then
- if type(value) == 'table' and #value == 0 and next(value) then
- -- TODO: workaround, json-edit cannot edit an empty object
+ if type(value) == 'table' and #value == 0 then
return {
- op = 'add',
- path = '/' .. change.key .. '/' .. change.prop,
- data = change.value,
+ op = 'add',
+ path = '/' .. change.key .. '/' .. change.prop,
+ value = change.value,
}
else
return makeConfigPatch(cfg, {
diff --git a/script/json-edit.lua b/script/json-edit.lua
index 05fb6499..7f20b523 100644
--- a/script/json-edit.lua
+++ b/script/json-edit.lua
@@ -425,7 +425,7 @@ local function query_(ast, pathlst, n)
end
end
if n == #pathlst then
- return data, k, isarray
+ return ast, k, isarray
end
return query_(data[k], pathlst, n + 1)
end
@@ -499,6 +499,19 @@ local function apply_array_insert_after(str, option, value, node)
.. finish_text
end
+local function apply_array_insert_empty(str, option, value, node)
+ local start_text = str:sub(1, node.s)
+ local finish_text = str:sub(node.f-1)
+ option.depth = option.depth + node.d + 1
+ return start_text
+ .. option.newline
+ .. string_rep(option.indent, option.depth)
+ .. json.beautify(value, option)
+ .. option.newline
+ .. string_rep(option.indent, option.depth-1)
+ .. finish_text
+end
+
local function apply_replace(str, option, value, node)
local start_text = str:sub(1, node.s-1)
local finish_text = str:sub(node.f)
@@ -509,7 +522,7 @@ local function apply_replace(str, option, value, node)
end
local function apply_object_insert(str, option, value, t, k)
- local node = find_max_node(t)
+ local node = find_max_node(t.v)
if node then
local start_text = str:sub(1, node.f-1)
local finish_text = str:sub(node.f)
@@ -523,6 +536,20 @@ local function apply_object_insert(str, option, value, t, k)
.. '": '
.. json.beautify(value, option)
.. finish_text
+ else
+ local start_text = str:sub(1, t.s)
+ local finish_text = str:sub(t.f-1)
+ option.depth = option.depth + t.d + 1
+ return start_text
+ .. option.newline
+ .. string_rep(option.indent, option.depth)
+ .. '"'
+ .. json._encode_string(k)
+ .. '": '
+ .. json.beautify(value, option)
+ .. option.newline
+ .. string_rep(option.indent, option.depth-1)
+ .. finish_text
end
end
@@ -553,14 +580,16 @@ function OP.add(str, option, path, value)
return
end
if isarray then
- if t[k] then
- return apply_array_insert_before(str, option, value, t[k])
+ if t.v[k] then
+ return apply_array_insert_before(str, option, value, t.v[k])
+ elseif k == 1 then
+ return apply_array_insert_empty(str, option, value, t)
else
- return apply_array_insert_after(str, option, value, t[k-1])
+ return apply_array_insert_after(str, option, value, t.v[k-1])
end
else
- if t[k] then
- return apply_replace(str, option, value, t[k])
+ if t.v[k] then
+ return apply_replace(str, option, value, t.v[k])
else
return apply_object_insert(str, option, value, t, k)
end
@@ -577,15 +606,15 @@ function OP.remove(str, _, path)
return
end
if isarray then
- if k > #t then
+ if k > #t.v then
return
end
- return apply_remove(str, t[k].s, t[k].f)
+ return apply_remove(str, t.v[k].s, t.v[k].f)
else
- if t[k] == nil then
+ if t.v[k] == nil then
return
end
- return apply_remove(str, t[k].key_s, t[k].f)
+ return apply_remove(str, t.v[k].key_s, t.v[k].f)
end
end
@@ -601,11 +630,15 @@ function OP.replace(str, option, path, value)
if not t then
return
end
- if t[k] then
- return apply_replace(str, option, value, t[k])
+ if t.v[k] then
+ return apply_replace(str, option, value, t.v[k])
else
if isarray then
- return apply_array_insert_after(str, option, value, t[k-1])
+ if k == 1 then
+ return apply_array_insert_empty(str, option, value, t)
+ else
+ return apply_array_insert_after(str, option, value, t.v[k-1])
+ end
else
return apply_object_insert(str, option, value, t, k)
end
@@ -618,7 +651,7 @@ local function edit(str, patch, option)
return
end
option = json.beautify_option(option)
- return f(str, option, patch.path, patch.data)
+ return f(str, option, patch.path, patch.value)
end
json.edit = edit