IMPORTANT: due to a drive failure, as of 13-Mar-2021, the Mercurial repository had to be re-mirrored, which changed every commit SHA. The old SHAs and trees are backed up in the vault branches. Please migrate to the new branches as soon as you can.
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.
 
 
 
 
prosody/teal-src/util/jsonpointer.tl

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,
}