@@ -120,6 +120,7 @@ func Run[T, C, I any](ctx context.Context, s *State[C], driver drivers.Interface
120
120
data := & TemplateData [T , C , I ]{
121
121
Dialect : driver .Dialect (),
122
122
Tables : dbInfo .Tables ,
123
+ QueryFolders : dbInfo .QueryFolders ,
123
124
Enums : dbInfo .Enums ,
124
125
ExtraInfo : dbInfo .ExtraInfo ,
125
126
Aliases : s .Config .Aliases ,
@@ -162,17 +163,14 @@ func generate[T, C, I any](s *State[C], data *TemplateData[T, C, I], goVersion s
162
163
templateHeaderByteBuffer := & bytes.Buffer {}
163
164
164
165
for _ , o := range s .Outputs {
165
- if len (o .Templates ) == 0 {
166
- continue
167
- }
168
-
169
166
if _ , ok := knownKeys [o .Key ]; ok {
170
167
return fmt .Errorf ("Duplicate output key: %q" , o .Key )
171
168
}
172
169
knownKeys [o .Key ] = struct {}{}
173
170
174
- // set the package name for this output
175
- data .PkgName = o .PkgName
171
+ if len (o .Templates ) == 0 {
172
+ continue
173
+ }
176
174
177
175
if err := o .initTemplates (s .CustomTemplateFuncs ); err != nil {
178
176
return fmt .Errorf ("unable to initialize templates: %w" , err )
@@ -182,26 +180,66 @@ func generate[T, C, I any](s *State[C], data *TemplateData[T, C, I], goVersion s
182
180
continue
183
181
}
184
182
185
- if err := o .initOutFolders (s .Config .Wipe ); err != nil {
186
- return fmt .Errorf ("unable to initialize the output folders: %w" , err )
187
- }
183
+ iterator := slices .Values ([]struct {}{{}})
188
184
189
- // assign reusable scratch buffers to provided Output
190
- o .templateByteBuffer = templateByteBuffer
191
- o .templateHeaderByteBuffer = templateHeaderByteBuffer
185
+ if o .Key == "queries" {
186
+ iterator = func (yield func (struct {}) bool ) {
187
+ for _ , folder := range data .QueryFolders {
188
+ o .PkgName = filepath .Base (folder .Path )
189
+ o .OutFolder = folder .Path
190
+ data .QueryFolder = folder
192
191
193
- if err := generateSingletonOutput (o , data , goVersion , s .Config .NoTests ); err != nil {
194
- return fmt .Errorf ("singleton template output: %w" , err )
192
+ if ! yield (struct {}{}) {
193
+ return
194
+ }
195
+ }
196
+ }
195
197
}
196
198
197
- dirExtMap := groupTemplates (o .tableTemplates )
199
+ for range iterator {
200
+ // set the package name for this output
201
+ data .PkgName = o .PkgName
202
+
203
+ if err := o .initOutFolders (s .Config .Wipe ); err != nil {
204
+ return fmt .Errorf ("unable to initialize the output folders: %w" , err )
205
+ }
206
+
207
+ // assign reusable scratch buffers to provided Output
208
+ o .templateByteBuffer = templateByteBuffer
209
+ o .templateHeaderByteBuffer = templateHeaderByteBuffer
210
+
211
+ if err := generateSingletonOutput (o , data , goVersion , s .Config .NoTests ); err != nil {
212
+ return fmt .Errorf ("singleton template output: %w" , err )
213
+ }
214
+
215
+ dirExtMap := groupTemplates (o .tableTemplates )
216
+
217
+ for _ , table := range data .Tables {
218
+ data .Table = table
219
+
220
+ // Generate the regular templates
221
+ if err := generateOutput (o , dirExtMap , o .tableTemplates , data , goVersion , s .Config .NoTests ); err != nil {
222
+ return fmt .Errorf ("unable to generate output: %w" , err )
223
+ }
224
+ }
225
+
226
+ if len (data .QueryFolder .Files ) == 0 {
227
+ continue
228
+ }
229
+
230
+ dirExtMap = groupTemplates (o .queryTemplates )
231
+ for _ , file := range data .QueryFolder .Files {
232
+ data .QueryFile = file
198
233
199
- for _ , table := range data .Tables {
200
- data .Table = table
234
+ // We do this so that the name of the file is correct
235
+ base := filepath .Base (file .Path )
236
+ data .Table = drivers.Table [C , I ]{
237
+ Name : base [:len (base )- 4 ],
238
+ }
201
239
202
- // Generate the regular templates
203
- if err := generateOutput ( o , dirExtMap , data , goVersion , s . Config . NoTests ); err != nil {
204
- return fmt . Errorf ( "unable to generate output: %w" , err )
240
+ if err := generateOutput ( o , dirExtMap , o . queryTemplates , data , goVersion , s . Config . NoTests ); err != nil {
241
+ return fmt . Errorf ( "unable to generate output: %w" , err )
242
+ }
205
243
}
206
244
}
207
245
}
0 commit comments