-
Notifications
You must be signed in to change notification settings - Fork 4
/
loader.go
134 lines (108 loc) · 3.1 KB
/
loader.go
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
131
132
133
134
package modules
import (
// Stdlib
"fmt"
// Internal
"github.com/salsaflow/salsaflow/config"
"github.com/salsaflow/salsaflow/config/loader"
"github.com/salsaflow/salsaflow/errs"
"github.com/salsaflow/salsaflow/modules/common"
)
var (
issueTracker common.IssueTracker
codeReviewTool common.CodeReviewTool
releaseNotesManager common.ReleaseNotesManager
)
func AvailableModules() []loader.Module {
modules := make([]loader.Module, len(registeredModules))
copy(modules, registeredModules)
return modules
}
func GetIssueTracker() (common.IssueTracker, error) {
if issueTracker != nil {
return issueTracker, nil
}
module, err := loadActiveModule(loader.ModuleKindIssueTracking)
if err != nil {
return nil, err
}
trackerModule, err := AsIssueTrackingModule(module)
if err != nil {
return nil, err
}
implementation, err := trackerModule.NewIssueTracker()
if err != nil {
return nil, err
}
issueTracker = implementation
return issueTracker, nil
}
func GetCodeReviewTool() (common.CodeReviewTool, error) {
if codeReviewTool != nil {
return codeReviewTool, nil
}
module, err := loadActiveModule(loader.ModuleKindCodeReview)
if err != nil {
return nil, err
}
reviewModule, err := AsCodeReviewModule(module)
if err != nil {
return nil, err
}
implementation, err := reviewModule.NewCodeReviewTool()
if err != nil {
return nil, err
}
codeReviewTool = implementation
return codeReviewTool, nil
}
func GetReleaseNotesManager() (common.ReleaseNotesManager, error) {
if releaseNotesManager != nil {
return releaseNotesManager, nil
}
module, err := loadActiveModule(loader.ModuleKindReleaseNotes)
if err != nil {
return nil, err
}
notesModule, err := AsReleaseNotesModule(module)
if err != nil {
return nil, err
}
implementation, err := notesModule.NewReleaseNotesManager()
if err != nil {
return nil, err
}
releaseNotesManager = implementation
return releaseNotesManager, nil
}
func loadActiveModule(kind loader.ModuleKind) (loader.Module, error) {
// Load local configuration.
localConfig, err := config.ReadLocalConfig()
if err != nil {
return nil, err
}
// Get the module matching the module kind.
activeModuleId := loader.ActiveModule(localConfig, kind)
if activeModuleId == "" {
task := fmt.Sprintf("Get active module ID for module kind '%v'", kind)
err := &ErrModuleNotSet{kind}
hint := "\nMake sure the ID is specified in the local configuration file.\n\n"
return nil, errs.NewErrorWithHint(task, err, hint)
}
// Find the module among the registered modules.
for _, module := range registeredModules {
if module.Id() == activeModuleId {
return module, nil
}
}
task := fmt.Sprintf("Load active module for module kind '%v'", kind)
err = &ErrModuleNotFound{activeModuleId}
hint := `
The module for the given module ID was not found.
This can happen for one of the following reasons:
1. the module ID as stored in the local configuration file is mistyped, or
2. the module for the given module ID was not linked into your SalsaFlow.
Check the scenarios as mentioned above to fix the issue.
`
return nil, errs.NewErrorWithHint(task, err, hint)
}