Comparison

teal-src/util/jsonpointer.tl @ 12131:b4c0efff8dd3

util.jsonpointer: Resolve JSON Pointers per RFC 6901
author Kim Alvefur <zash@zash.se>
date Wed, 29 Dec 2021 16:52:09 +0100
child 12496:87c3d45208ef
comparison
equal deleted inserted replaced
12130:c4ca226ff386 12131:b4c0efff8dd3
1
2 local enum ptr_error
3 "invalid-table"
4 "invalid-path"
5 end
6
7 local function unescape_token(escaped_token : string) : string
8 local unescaped = escaped_token:gsub("~1", "/"):gsub("~0", "~")
9 return unescaped
10 end
11
12 local function resolve_json_pointer(ref : table, path : string) : any, ptr_error
13 local ptr_len = #path+1
14 for part, pos in path:gmatch("/([^/]*)()") do
15 local token = unescape_token(part)
16 if not ref is table then
17 return nil
18 end
19 local idx = next(ref)
20 local new_ref : any
21
22 if idx is string then
23 new_ref = ref[token]
24 elseif idx is integer then
25 local i = tonumber(token)
26 if token == "-" then i = #ref + 1 end
27 new_ref = ref[i]
28 else
29 return nil, "invalid-table"
30 end
31
32 if pos as integer == ptr_len then
33 return new_ref
34 elseif new_ref is table then
35 ref = new_ref
36 elseif not ref is table then
37 return nil, "invalid-path"
38 end
39
40 end
41 return ref
42 end
43
44 return {
45 resolve = resolve_json_pointer,
46 }