@@ -34,159 +34,142 @@ type Value struct {
34
34
}
35
35
36
36
// Compute accepts a scope in which parameter values are sourced.
37
- // These sources are iterated in ahierarchial fashion to determine
38
- // the runtime parametervaues for a project.
37
+ // These sources are iterated in ahierarchical fashion to determine
38
+ // the runtime parametervalues for a project.
39
39
func Compute (ctx context.Context ,db database.Store ,scope Scope ) ([]Value ,error ) {
40
40
compute := & compute {
41
- parameterByName :map [string ]Value {},
42
- projectParameterByName :map [string ]database.ProjectParameter {},
41
+ db :db ,
42
+ computedParameterByName :map [string ]Value {},
43
+ projectHistoryParametersByName :map [string ]database.ProjectParameter {},
43
44
}
44
45
45
46
// All parameters for the project version!
46
47
projectHistoryParameters ,err := db .GetProjectParametersByHistoryID (ctx ,scope .ProjectHistoryID )
47
48
if errors .Is (err ,sql .ErrNoRows ) {
48
- // It's valid to have no parameters!
49
+ // This occurs when the project history has defined
50
+ // no parameters, so we have nothing to compute!
49
51
return []Value {},nil
50
52
}
51
53
if err != nil {
52
54
return nil ,xerrors .Errorf ("get project parameters: %w" ,err )
53
55
}
54
- for _ ,projectParameter := range projectHistoryParameters {
55
- compute .projectParameterByName [ projectParameter .Name ]= projectParameter
56
+ for _ ,projectHistoryParameter := range projectHistoryParameters {
57
+ compute .projectHistoryParametersByName [ projectHistoryParameter .Name ]= projectHistoryParameter
56
58
}
57
59
58
60
// Organization parameters come first!
59
- organizationParameters , err := db . GetParameterValuesByScope (ctx , database.GetParameterValuesByScopeParams {
61
+ err = compute . inject (ctx , database.GetParameterValuesByScopeParams {
60
62
Scope :database .ParameterScopeOrganization ,
61
63
ScopeID :scope .OrganizationID ,
62
64
})
63
- if errors .Is (err ,sql .ErrNoRows ) {
64
- err = nil
65
- }
66
65
if err != nil {
67
- return nil ,xerrors .Errorf ("get organization parameters: %w" ,err )
68
- }
69
- err = compute .inject (organizationParameters )
70
- if err != nil {
71
- return nil ,xerrors .Errorf ("inject organization parameters: %w" ,err )
66
+ return nil ,err
72
67
}
73
68
74
69
// Default project parameter values come second!
75
- for _ ,projectParameter := range projectHistoryParameters {
76
- if ! projectParameter .DefaultSourceValue .Valid {
70
+ for _ ,projectHistoryParameter := range projectHistoryParameters {
71
+ if ! projectHistoryParameter .DefaultSourceValue .Valid {
77
72
continue
78
73
}
79
- if ! projectParameter .DefaultDestinationValue .Valid {
74
+ if ! projectHistoryParameter .DefaultDestinationValue .Valid {
80
75
continue
81
76
}
82
77
83
- destinationScheme ,err := convertDestinationScheme (projectParameter .DefaultDestinationScheme )
78
+ destinationScheme ,err := convertDestinationScheme (projectHistoryParameter .DefaultDestinationScheme )
84
79
if err != nil {
85
- return nil ,xerrors .Errorf ("convert default destination scheme for project parameter %q: %w" ,projectParameter .Name ,err )
80
+ return nil ,xerrors .Errorf ("convert default destination scheme for projecthistory parameter %q: %w" ,projectHistoryParameter .Name ,err )
86
81
}
87
82
88
- switch projectParameter .DefaultSourceScheme {
83
+ switch projectHistoryParameter .DefaultSourceScheme {
89
84
case database .ParameterSourceSchemeData :
90
- compute .parameterByName [ projectParameter .Name ]= Value {
85
+ compute .computedParameterByName [ projectHistoryParameter .Name ]= Value {
91
86
Proto :& proto.ParameterValue {
92
87
DestinationScheme :destinationScheme ,
93
- Name :projectParameter .DefaultDestinationValue .String ,
94
- Value :projectParameter .DefaultSourceValue .String ,
88
+ Name :projectHistoryParameter .DefaultDestinationValue .String ,
89
+ Value :projectHistoryParameter .DefaultSourceValue .String ,
95
90
},
96
91
DefaultValue :true ,
97
92
Scope :database .ParameterScopeProject ,
98
93
ScopeID :scope .ProjectID .String (),
99
94
}
100
95
default :
101
- return nil ,xerrors .Errorf ("unsupported source scheme for project parameter %q: %q" ,projectParameter .Name ,string (projectParameter .DefaultSourceScheme ))
96
+ return nil ,xerrors .Errorf ("unsupported source scheme for projecthistory parameter %q: %q" ,projectHistoryParameter .Name ,string (projectHistoryParameter .DefaultSourceScheme ))
102
97
}
103
98
}
104
99
105
100
// Project parameters come third!
106
- projectParameters , err := db . GetParameterValuesByScope (ctx , database.GetParameterValuesByScopeParams {
101
+ err = compute . inject (ctx , database.GetParameterValuesByScopeParams {
107
102
Scope :database .ParameterScopeProject ,
108
103
ScopeID :scope .ProjectID .String (),
109
104
})
110
- if errors .Is (err ,sql .ErrNoRows ) {
111
- err = nil
112
- }
113
- if err != nil {
114
- return nil ,xerrors .Errorf ("get project parameters: %w" ,err )
115
- }
116
- err = compute .inject (projectParameters )
117
105
if err != nil {
118
- return nil ,xerrors . Errorf ( "inject project parameters: %w" , err )
106
+ return nil ,err
119
107
}
120
108
121
109
// User parameters come fourth!
122
- userParameters , err := db . GetParameterValuesByScope (ctx , database.GetParameterValuesByScopeParams {
110
+ err = compute . inject (ctx , database.GetParameterValuesByScopeParams {
123
111
Scope :database .ParameterScopeUser ,
124
112
ScopeID :scope .UserID ,
125
113
})
126
- if errors .Is (err ,sql .ErrNoRows ) {
127
- err = nil
128
- }
129
114
if err != nil {
130
- return nil ,xerrors .Errorf ("get user parameters: %w" ,err )
131
- }
132
- err = compute .inject (userParameters )
133
- if err != nil {
134
- return nil ,xerrors .Errorf ("inject user parameters: %w" ,err )
115
+ return nil ,err
135
116
}
136
117
137
118
// Workspace parameters come last!
138
- workspaceParameters , err := db . GetParameterValuesByScope (ctx , database.GetParameterValuesByScopeParams {
119
+ err = compute . inject (ctx , database.GetParameterValuesByScopeParams {
139
120
Scope :database .ParameterScopeWorkspace ,
140
121
ScopeID :scope .WorkspaceID .String (),
141
122
})
142
- if errors .Is (err ,sql .ErrNoRows ) {
143
- err = nil
144
- }
145
- if err != nil {
146
- return nil ,xerrors .Errorf ("get workspace parameters: %w" ,err )
147
- }
148
- err = compute .inject (workspaceParameters )
149
123
if err != nil {
150
- return nil ,xerrors . Errorf ( "inject workspace parameters: %w" , err )
124
+ return nil ,err
151
125
}
152
126
153
- for _ ,projectParameter := range compute .projectParameterByName {
154
- if _ ,ok := compute .parameterByName [ projectParameter .Name ];ok {
127
+ for _ ,projectHistoryParameter := range compute .projectHistoryParametersByName {
128
+ if _ ,ok := compute .computedParameterByName [ projectHistoryParameter .Name ];ok {
155
129
continue
156
130
}
157
131
return nil ,NoValueError {
158
- ParameterID :projectParameter .ID ,
159
- ParameterName :projectParameter .Name ,
132
+ ParameterID :projectHistoryParameter .ID ,
133
+ ParameterName :projectHistoryParameter .Name ,
160
134
}
161
135
}
162
136
163
- values := make ([]Value ,0 ,len (compute .parameterByName ))
164
- for _ ,value := range compute .parameterByName {
137
+ values := make ([]Value ,0 ,len (compute .computedParameterByName ))
138
+ for _ ,value := range compute .computedParameterByName {
165
139
values = append (values ,value )
166
140
}
167
141
return values ,nil
168
142
}
169
143
170
144
type compute struct {
171
- parameterByName map [string ]Value
172
- projectParameterByName map [string ]database.ProjectParameter
145
+ db database.Store
146
+ computedParameterByName map [string ]Value
147
+ projectHistoryParametersByName map [string ]database.ProjectParameter
173
148
}
174
149
175
150
// Validates and computes the value for parameters; setting the value on "parameterByName".
176
- func (c * compute )inject (scopedParameters []database.ParameterValue )error {
151
+ func (c * compute )inject (ctx context.Context ,scopeParams database.GetParameterValuesByScopeParams )error {
152
+ scopedParameters ,err := c .db .GetParameterValuesByScope (ctx ,scopeParams )
153
+ if errors .Is (err ,sql .ErrNoRows ) {
154
+ err = nil
155
+ }
156
+ if err != nil {
157
+ return xerrors .Errorf ("get %s parameters: %w" ,scopeParams .Scope ,err )
158
+ }
159
+
177
160
for _ ,scopedParameter := range scopedParameters {
178
- projectParameter , hasProjectParameter := c .projectParameterByName [scopedParameter .Name ]
179
- if ! hasProjectParameter {
161
+ projectHistoryParameter , hasProjectHistoryParameter := c .projectHistoryParametersByName [scopedParameter .Name ]
162
+ if ! hasProjectHistoryParameter {
180
163
// Don't inject parameters that aren't defined by the project.
181
164
continue
182
165
}
183
166
184
- _ ,hasExistingParameter := c .parameterByName [scopedParameter .Name ]
167
+ _ ,hasExistingParameter := c .computedParameterByName [scopedParameter .Name ]
185
168
if hasExistingParameter {
186
169
// If a parameter already exists, check if this variable can override it.
187
170
// Injection hierarchy is the responsibility of the caller. This check ensures
188
171
// project parameters cannot be overridden if already set.
189
- if ! projectParameter .AllowOverrideSource && scopedParameter .Scope != database .ParameterScopeProject {
172
+ if ! projectHistoryParameter .AllowOverrideSource && scopedParameter .Scope != database .ParameterScopeProject {
190
173
continue
191
174
}
192
175
}
@@ -198,15 +181,15 @@ func (c *compute) inject(scopedParameters []database.ParameterValue) error {
198
181
199
182
switch scopedParameter .SourceScheme {
200
183
case database .ParameterSourceSchemeData :
201
- c .parameterByName [ projectParameter .Name ]= Value {
184
+ c .computedParameterByName [ projectHistoryParameter .Name ]= Value {
202
185
Proto :& proto.ParameterValue {
203
186
DestinationScheme :destinationScheme ,
204
187
Name :scopedParameter .SourceValue ,
205
188
Value :scopedParameter .DestinationValue ,
206
189
},
207
190
}
208
191
default :
209
- return xerrors .Errorf ("unsupported source scheme: %q" ,string (projectParameter .DefaultSourceScheme ))
192
+ return xerrors .Errorf ("unsupported source scheme: %q" ,string (projectHistoryParameter .DefaultSourceScheme ))
210
193
}
211
194
}
212
195
return nil