in internal/flowcontrol/writebuffer.go [182:237]
func (*ResourceSliceWriteBuffer) buildPatch(slice *apiv1.ResourceSlice, updates []*resourceSliceStatusUpdate) []*jsonPatch {
var patches []*jsonPatch
unsafeSlice := slice.Status.Resources
if len(unsafeSlice) == 0 {
patches = append(patches,
&jsonPatch{
Op: "add",
Path: "/status",
Value: map[string]any{},
},
&jsonPatch{
Op: "test",
Path: "/status/resources",
Value: nil,
},
&jsonPatch{
Op: "add",
Path: "/status/resources",
Value: make([]apiv1.ResourceState, len(slice.Spec.Resources)),
})
}
for _, update := range updates {
if update.SlicedResource.Index > len(slice.Spec.Resources)-1 || update.SlicedResource.Index < 0 {
continue // impossible
}
var unsafeStatusPtr *apiv1.ResourceState
if len(unsafeSlice) <= update.SlicedResource.Index {
unsafeStatusPtr = &apiv1.ResourceState{}
} else {
unsafeStatusPtr = &unsafeSlice[update.SlicedResource.Index]
}
patch := update.PatchFn(unsafeStatusPtr)
if patch == nil {
continue
}
path := fmt.Sprintf("/status/resources/%d", update.SlicedResource.Index)
patches = append(patches,
&jsonPatch{
Op: "test", // make sure the current state is equal to the state we built the patch against
Path: path,
Value: unsafeStatusPtr,
},
&jsonPatch{
Op: "replace",
Path: path,
Value: patch,
})
}
return patches
}