blob: f1c354a4b2757a788e8db5b9bcaa900f3bbf9e7a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
local m_type = math.type;
local function unescape_token(escaped_token)
local unescaped = escaped_token:gsub("~1", "/"):gsub("~0", "~")
return unescaped
end
local function resolve_json_pointer(ref, path)
local ptr_len = #path + 1
for part, pos in path:gmatch("/([^/]*)()") do
local token = unescape_token(part)
if not (type(ref) == "table") then
return nil
end
local idx = next(ref)
local new_ref
if type(idx) == "string" then
new_ref = ref[token]
elseif m_type(idx) == "integer" then
local i = tonumber(token)
if token == "-" then
i = #ref + 1
end
new_ref = ref[i + 1]
else
return nil, "invalid-table"
end
if pos == ptr_len then
return new_ref
elseif type(new_ref) == "table" then
ref = new_ref
elseif not (type(ref) == "table") then
return nil, "invalid-path"
end
end
return ref
end
return { resolve = resolve_json_pointer }
|