func()

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
}