merge.go

 1package entity
 2
 3import "fmt"
 4
 5// MergeStatus represent the result of a merge operation of an entity
 6type MergeStatus int
 7
 8const (
 9	_ MergeStatus = iota
10	MergeStatusNew
11	MergeStatusInvalid
12	MergeStatusUpdated
13	MergeStatusNothing
14)
15
16type MergeResult struct {
17	// Err is set when a terminal error occur in the process
18	Err error
19
20	Id     string
21	Status MergeStatus
22
23	// Only set for invalid status
24	Reason string
25
26	// Not set for invalid status
27	Entity Interface
28}
29
30func (mr MergeResult) String() string {
31	switch mr.Status {
32	case MergeStatusNew:
33		return "new"
34	case MergeStatusInvalid:
35		return fmt.Sprintf("invalid data: %s", mr.Reason)
36	case MergeStatusUpdated:
37		return "updated"
38	case MergeStatusNothing:
39		return "nothing to do"
40	default:
41		panic("unknown merge status")
42	}
43}
44
45func NewMergeError(err error, id string) MergeResult {
46	return MergeResult{
47		Err: err,
48		Id:  id,
49	}
50}
51
52func NewMergeStatus(status MergeStatus, id string, entity Interface) MergeResult {
53	return MergeResult{
54		Id:     id,
55		Status: status,
56
57		// Entity is not set for an invalid merge result
58		Entity: entity,
59	}
60}
61
62func NewMergeInvalidStatus(id string, reason string) MergeResult {
63	return MergeResult{
64		Id:     id,
65		Status: MergeStatusInvalid,
66		Reason: reason,
67	}
68}