(oldJSON, newJSON []byte)
| 154 | } |
| 155 | |
| 156 | func calculateFieldChanges(oldJSON, newJSON []byte) ([]FieldChange, error) { |
| 157 | patchBytes, err := jsonpatch.CreateMergePatch(oldJSON, newJSON) |
| 158 | if err != nil { |
| 159 | return nil, err |
| 160 | } |
| 161 | trimmed := bytes.TrimSpace(patchBytes) |
| 162 | if len(trimmed) == 0 || bytes.Equal(trimmed, []byte("{}")) { |
| 163 | return nil, nil |
| 164 | } |
| 165 | |
| 166 | var patch interface{} |
| 167 | if err := json.Unmarshal(patchBytes, &patch); err != nil { |
| 168 | return nil, err |
| 169 | } |
| 170 | |
| 171 | var oldDoc interface{} |
| 172 | if len(oldJSON) > 0 { |
| 173 | if err := json.Unmarshal(oldJSON, &oldDoc); err != nil { |
| 174 | return nil, err |
| 175 | } |
| 176 | } |
| 177 | |
| 178 | var newDoc interface{} |
| 179 | if len(newJSON) > 0 { |
| 180 | if err := json.Unmarshal(newJSON, &newDoc); err != nil { |
| 181 | return nil, err |
| 182 | } |
| 183 | } |
| 184 | |
| 185 | var changes []FieldChange |
| 186 | if err := walkPatch(&changes, nil, patch, oldDoc, newDoc); err != nil { |
| 187 | return nil, err |
| 188 | } |
| 189 | return changes, nil |
| 190 | } |
| 191 | |
| 192 | func walkPatch(changes *[]FieldChange, tokens []string, patchNode, oldNode, newNode interface{}) error { |
| 193 | switch typed := patchNode.(type) { |
no test coverage detected