aboutsummaryrefslogtreecommitdiffstats
path: root/bridge/core/export.go
blob: 0f45404c63aaca27d672b550610e6544ccc74364 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package core

import (
	"fmt"

	"github.com/MichaelMure/git-bug/entity"
)

type ExportEvent int

const (
	_ ExportEvent = iota

	// Bug has been exported on the remote tracker
	ExportEventBug
	// Comment has been exported on the remote tracker
	ExportEventComment
	// Comment has been edited on the remote tracker
	ExportEventCommentEdition
	// Bug's status has been changed on on the remote tracker
	ExportEventStatusChange
	// Bug's title has been changed on the remote tracker
	ExportEventTitleEdition
	// Bug's labels have been changed on the remote tracker
	ExportEventLabelChange

	// Nothing changed on the bug
	ExportEventNothing

	// Error happened during export
	ExportEventError
)

// ExportResult is an event that is emitted during the export process, to
// allow calling code to report on what is happening, collect metrics or
// display meaningful errors if something went wrong.
type ExportResult struct {
	Err    error
	Event  ExportEvent
	ID     entity.Id
	Reason string
}

func (er ExportResult) String() string {
	switch er.Event {
	case ExportEventBug:
		return fmt.Sprintf("new issue: %s", er.ID)
	case ExportEventComment:
		return fmt.Sprintf("new comment: %s", er.ID)
	case ExportEventCommentEdition:
		return fmt.Sprintf("updated comment: %s", er.ID)
	case ExportEventStatusChange:
		return fmt.Sprintf("changed status: %s", er.ID)
	case ExportEventTitleEdition:
		return fmt.Sprintf("changed title: %s", er.ID)
	case ExportEventLabelChange:
		return fmt.Sprintf("changed label: %s", er.ID)
	case ExportEventNothing:
		if er.ID != "" {
			return fmt.Sprintf("no actions taken for event %s: %s", er.ID, er.Reason)
		}
		return fmt.Sprintf("no actions taken: %s", er.Reason)
	case ExportEventError:
		if er.ID != "" {
			return fmt.Sprintf("export error at %s: %s", er.ID, er.Err.Error())
		}
		return fmt.Sprintf("export error: %s", er.Err.Error())

	default:
		panic("unknown export result")
	}
}

func NewExportError(err error, id entity.Id) ExportResult {
	return ExportResult{
		ID:    id,
		Err:   err,
		Event: ExportEventError,
	}
}

func NewExportNothing(id entity.Id, reason string) ExportResult {
	return ExportResult{
		ID:     id,
		Reason: reason,
		Event:  ExportEventNothing,
	}
}

func NewExportBug(id entity.Id) ExportResult {
	return ExportResult{
		ID:    id,
		Event: ExportEventBug,
	}
}

func NewExportComment(id entity.Id) ExportResult {
	return ExportResult{
		ID:    id,
		Event: ExportEventComment,
	}
}

func NewExportCommentEdition(id entity.Id) ExportResult {
	return ExportResult{
		ID:    id,
		Event: ExportEventCommentEdition,
	}
}

func NewExportStatusChange(id entity.Id) ExportResult {
	return ExportResult{
		ID:    id,
		Event: ExportEventStatusChange,
	}
}

func NewExportLabelChange(id entity.Id) ExportResult {
	return ExportResult{
		ID:    id,
		Event: ExportEventLabelChange,
	}
}

func NewExportTitleEdition(id entity.Id) ExportResult {
	return ExportResult{
		ID:    id,
		Event: ExportEventTitleEdition,
	}
}