merge.go

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