mirror of https://github.com/bjc/prosody
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
945 B
46 lines
945 B
|
|
local enum ptr_error
|
|
"invalid-table"
|
|
"invalid-path"
|
|
end
|
|
|
|
local function unescape_token(escaped_token : string) : string
|
|
local unescaped = escaped_token:gsub("~1", "/"):gsub("~0", "~")
|
|
return unescaped
|
|
end
|
|
|
|
local function resolve_json_pointer(ref : table, path : string) : any, ptr_error
|
|
local ptr_len = #path+1
|
|
for part, pos in path:gmatch("/([^/]*)()") do
|
|
local token = unescape_token(part)
|
|
if not ref is table then
|
|
return nil
|
|
end
|
|
local idx = next(ref)
|
|
local new_ref : any
|
|
|
|
if idx is string then
|
|
new_ref = ref[token]
|
|
elseif idx is 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 as integer == ptr_len then
|
|
return new_ref
|
|
elseif new_ref is table then
|
|
ref = new_ref
|
|
elseif not ref is table then
|
|
return nil, "invalid-path"
|
|
end
|
|
|
|
end
|
|
return ref
|
|
end
|
|
|
|
return {
|
|
resolve = resolve_json_pointer,
|
|
}
|
|
|