package main

const (
	addOperation     = "add"
	removeOperation  = "remove"
	replaceOperation = "replace"
	copyOperation    = "copy"
	moveOperation    = "move"
)

type patchOperation struct {
	Op    string      `json:"op"`
	Path  string      `json:"path"`
	From  string      `json:"from"`
	Value interface{} `json:"value,omitempty"`
}

func addPatchOperation(path string, value interface{}) patchOperation {
	return patchOperation{
		Op:    addOperation,
		Path:  path,
		Value: value,
	}
}

// RemovePatchOperation returns a remove JSON patch operation.
func removePatchOperation(path string) patchOperation {
	return patchOperation{
		Op:   removeOperation,
		Path: path,
	}
}

// ReplacePatchOperation returns a replace JSON patch operation.
func replacePatchOperation(path string, value interface{}) patchOperation {
	return patchOperation{
		Op:    replaceOperation,
		Path:  path,
		Value: value,
	}
}

// CopyPatchOperation returns a copy JSON patch operation.
func copyPatchOperation(from, path string) patchOperation {
	return patchOperation{
		Op:   copyOperation,
		Path: path,
		From: from,
	}
}

// MovePatchOperation returns a move JSON patch operation.
func movePatchOperation(from, path string) patchOperation {
	return patchOperation{
		Op:   moveOperation,
		Path: path,
		From: from,
	}
}