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	MergeStatusError
17)
18
19type MergeResult struct {
20	// Err is set when a terminal error occur in the process
21	Err error
22
23	Id     Id
24	Status MergeStatus
25
26	// Only set for invalid status
27	Reason string
28
29	// Not set for invalid status
30	Entity Interface
31}
32
33func (mr MergeResult) String() string {
34	switch mr.Status {
35	case MergeStatusNew:
36		return "new"
37	case MergeStatusInvalid:
38		return fmt.Sprintf("invalid data: %s", mr.Reason)
39	case MergeStatusUpdated:
40		return "updated"
41	case MergeStatusNothing:
42		return "nothing to do"
43	case MergeStatusError:
44		return fmt.Sprintf("merge error on %s: %s", mr.Id, mr.Err.Error())
45	default:
46		panic("unknown merge status")
47	}
48}
49
50func NewMergeError(err error, id Id) MergeResult {
51	return MergeResult{
52		Err:    err,
53		Id:     id,
54		Status: MergeStatusError,
55	}
56}
57
58func NewMergeStatus(status MergeStatus, id Id, entity Interface) MergeResult {
59	return MergeResult{
60		Id:     id,
61		Status: status,
62
63		// Entity is not set for an invalid merge result
64		Entity: entity,
65	}
66}
67
68func NewMergeInvalidStatus(id Id, reason string) MergeResult {
69	return MergeResult{
70		Id:     id,
71		Status: MergeStatusInvalid,
72		Reason: reason,
73	}
74}