@@ -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 a hierarchial fashion to determine
38
- // the runtime parameter vaues for a project.
37
+ // These sources are iterated in a hierarchical fashion to determine
38
+ // the runtime parameter values 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 project history 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 project history 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
0 commit comments