File

teal-src/util/jsonpointer.tl @ 12605:053417068957

doap: Update XEP versions for which no code changes appear needed XEP-0004: Partial forms are handled XEP-0045: We're already strict with GC 1.0 XEP-0060: Change in semantics wrt 'pubsub#type', but not in code XEP-0115: No protocol change XEP-0138: Specification moved to Obsolete XEP-0163: Editorial only change XEP-0215: Minor schema change XEP-0280: Editorial change XEP-0297: Had the wrong version number XEP-0106: Note missing piece for version 1.1 XEP-0313: Editorial change XEP-0363: Editorial clarification, no code change required XEP-0380: Registry additions, no code change needed XEP-0384: Not directly supported, only here because people will ask otherwise XEP-0445: Broken out of XEP-0401
author Kim Alvefur <zash@zash.se>
date Mon, 08 Aug 2022 20:33:44 +0200
parent 12496:87c3d45208ef
line wrap: on
line source


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