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                 // a new Entity was created locally
13	MergeStatusInvalid             // the remote data is invalid
14	MergeStatusUpdated             // a local Entity has been updated
15	MergeStatusNothing             // no changes were made to a local Entity (already up to date)
16	MergeStatusError               // a terminal error happened
17)
18
19// MergeResult hold the result of a merge operation on an Entity.
20type MergeResult struct {
21	// Err is set when a terminal error occur in the process
22	Err error
23
24	Id     Id
25	Status MergeStatus
26
27	// Only set for Invalid status
28	Reason string
29
30	// Only set for New or Updated status
31	Entity Interface
32}
33
34func (mr MergeResult) String() string {
35	switch mr.Status {
36	case MergeStatusNew:
37		return "new"
38	case MergeStatusInvalid:
39		return fmt.Sprintf("invalid data: %s", mr.Reason)
40	case MergeStatusUpdated:
41		return "updated"
42	case MergeStatusNothing:
43		return "nothing to do"
44	case MergeStatusError:
45		if mr.Id != "" {
46			return fmt.Sprintf("merge error on %s: %s", mr.Id, mr.Err.Error())
47		}
48		return fmt.Sprintf("merge error: %s", mr.Err.Error())
49	default:
50		panic("unknown merge status")
51	}
52}
53
54func NewMergeNewStatus(id Id, entity Interface) MergeResult {
55	return MergeResult{
56		Id:     id,
57		Status: MergeStatusNew,
58		Entity: entity,
59	}
60}
61
62func NewMergeInvalidStatus(id Id, reason string) MergeResult {
63	return MergeResult{
64		Id:     id,
65		Status: MergeStatusInvalid,
66		Reason: reason,
67	}
68}
69
70func NewMergeUpdatedStatus(id Id, entity Interface) MergeResult {
71	return MergeResult{
72		Id:     id,
73		Status: MergeStatusUpdated,
74		Entity: entity,
75	}
76}
77
78func NewMergeNothingStatus(id Id) MergeResult {
79	return MergeResult{
80		Id:     id,
81		Status: MergeStatusNothing,
82	}
83}
84
85func NewMergeError(err error, id Id) MergeResult {
86	return MergeResult{
87		Id:     id,
88		Status: MergeStatusError,
89		Err:    err,
90	}
91}