File size: 1,268 Bytes
16cdcb7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package subscription

import (
	"fmt"
)

type PatchConflictError struct {
	Msg string
}

func (e *PatchConflictError) Error() string {
	return fmt.Sprintf("patch conflict error: %s", e.Msg)
}

type PatchValidationError struct {
	Msg string
}

func (e *PatchValidationError) Error() string {
	return fmt.Sprintf("patch validation error: %s", e.Msg)
}

type PatchForbiddenError struct {
	Msg string
}

func (e *PatchForbiddenError) Error() string {
	return fmt.Sprintf("patch forbidden error: %s", e.Msg)
}

type PatchOperation string

const (
	PatchOperationAdd        PatchOperation = "add"
	PatchOperationRemove     PatchOperation = "remove"
	PatchOperationUnschedule PatchOperation = "unschedule"
	PatchOperationStretch    PatchOperation = "stretch"
)

func (o PatchOperation) Validate() error {
	switch o {
	case PatchOperationAdd, PatchOperationRemove, PatchOperationStretch, PatchOperationUnschedule:
		return nil
	default:
		return fmt.Errorf("invalid patch operation: %s", o)
	}
}

type Patch interface {
	AppliesToSpec
	Validate() error
	Op() PatchOperation
	Path() SpecPath
}

type AnyValuePatch interface {
	ValueAsAny() any
}

type ValuePatch[T any] interface {
	Patch
	Value() T
	AnyValuePatch
}

func ToApplies(p Patch, _ int) AppliesToSpec {
	return p
}