blob: 968298094f1e41c518decc6c80a4e495a9d0fc61 [file] [log] [blame]
Lorenz Brunf042e6f2020-06-24 16:46:09 +02001// Copyright 2020 The Monogon Project Authors.
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16
17// Package jsonpatch contains data structures and encoders for JSON Patch (RFC 6902) and JSON Pointers (RFC 6901)
18package jsonpatch
19
20import "strings"
21
22// JSON Patch operation (RFC 6902 Section 4)
23type JsonPatchOp struct {
24 Operation string `json:"op"`
25 Path string `json:"path"` // Technically a JSON Pointer, but called Path in the RFC
26 From string `json:"from,omitempty"`
27 Value interface{} `json:"value,omitempty"`
28}
29
30// EncodeJSONRefToken encodes a JSON reference token as part of a JSON Pointer (RFC 6901 Section 2)
31func EncodeJSONRefToken(token string) string {
32 x := strings.ReplaceAll(token, "~", "~0")
33 return strings.ReplaceAll(x, "/", "~1")
34}
35
36// PointerFromParts returns an encoded JSON Pointer from parts
37func PointerFromParts(pathParts []string) string {
38 var encodedParts []string
39 encodedParts = append(encodedParts, "")
40 for _, part := range pathParts {
41 encodedParts = append(encodedParts, EncodeJSONRefToken(part))
42 }
43 return strings.Join(encodedParts, "/")
44}