@@ -129,7 +129,8 @@ public struct SwiftLanguage: Language {
129129 databaseName: String ,
130130 tables: [ GeneratedModel ] ,
131131 queries: [ GeneratedQuery ] ,
132- addConnection: Bool
132+ addConnection: Bool ,
133+ adapters: [ String ]
133134 ) -> [ String ] {
134135 var decls : [ String ] = [ ]
135136
@@ -142,6 +143,8 @@ public struct SwiftLanguage: Language {
142143
143144 writer. write ( " let connection: any Otter.Connection " )
144145 take ( )
146+ self . adapters ( adapters: adapters)
147+ take ( )
145148
146149 for table in tables {
147150 declaration ( for: table, isOutput: true )
@@ -173,20 +176,7 @@ public struct SwiftLanguage: Language {
173176
174177 writer. braces {
175178 writer. write ( line: " let connection: any Otter.Connection " )
176-
177- writer. write ( line: " let adapters: Adapters " )
178- // Don't require initialization if there are no custom adapters
179- if adapters. isEmpty {
180- writer. write ( " = Adapters() " )
181- }
182- writer. newline ( )
183-
184- writer. write ( line: " struct Adapters " )
185- writer. braces {
186- for adapter in adapters {
187- writer. write ( line: " let " , adapter, " : DatabaseValueAdapter " )
188- }
189- }
179+ self . adapters ( adapters: adapters)
190180
191181 writer. newline ( )
192182
@@ -224,6 +214,22 @@ public struct SwiftLanguage: Language {
224214 }
225215 }
226216
217+ private func adapters( adapters: [ String ] ) {
218+ writer. write ( line: " let adapters: Adapters " )
219+ writer. newline ( )
220+
221+ if adapters. isEmpty {
222+ writer. write ( line: " typealias Adapters = DefaultAdapters " )
223+ } else {
224+ writer. write ( line: " struct Adapters: Otter.Adapters " )
225+ writer. braces {
226+ for adapter in adapters {
227+ writer. write ( line: " let " , adapter, " : any DatabaseValueAdapter " )
228+ }
229+ }
230+ }
231+ }
232+
227233 private func queries( name: String , queries: [ GeneratedQuery ] ) {
228234 writer. write ( line: " struct " , name, " { " )
229235 writer. indent ( )
@@ -348,10 +354,16 @@ public struct SwiftLanguage: Language {
348354 } else {
349355 switch query. outputCardinality {
350356 case . single:
351- writer. write ( line: " return try statement.fetchOne() " )
357+ writer. write ( line: " return try statement.fetchOne( " )
352358 case . many:
353- writer. write ( line: " return try statement.fetchAll() " )
359+ writer. write ( line: " return try statement.fetchAll( " )
360+ }
361+
362+ if query. output. requiresAdapters {
363+ writer. write ( " adapters: adapters " )
354364 }
365+
366+ writer. write ( " ) " )
355367 }
356368
357369 writer. unindent ( )
@@ -407,7 +419,11 @@ public struct SwiftLanguage: Language {
407419 }
408420
409421 if isOutput {
410- writer. write ( " , RowDecodable " )
422+ if model. requiresAdapters {
423+ writer. write ( " , RowDecodableWithAdapters " )
424+ } else {
425+ writer. write ( " , RowDecodable " )
426+ }
411427 }
412428
413429 writer. write ( " { " )
@@ -491,6 +507,12 @@ public struct SwiftLanguage: Language {
491507 writer. indent ( )
492508 writer. write ( line: " row: borrowing Otter.Row, " )
493509 writer. write ( line: " startingAt start: Int32 " )
510+
511+ if model. requiresAdapters {
512+ writer. write ( " , " )
513+ writer. write ( line: " adapters: " , options. databaseName, " .Adapters " )
514+ }
515+
494516 writer. unindent ( )
495517 writer. write ( line: " ) throws(Otter.OtterError) { " )
496518
@@ -506,10 +528,18 @@ public struct SwiftLanguage: Language {
506528 writer. write ( " row.value(at: start + " , index. description, " ) " )
507529 index += 1
508530 case let . model( model) :
509- writer. write ( " row.embedded(at: start + " , index. description, " ) " )
531+ writer. write ( " row.embedded(at: start + " , index. description)
532+ if model. requiresAdapters {
533+ writer. write ( " , adapters: adapters " )
534+ }
535+ writer. write ( " ) " )
510536 index += model. fields. count
511537 case let . optional( . model( model) ) :
512- writer. write ( " row.optionallyEmbedded(at: start + " , index. description, " ) " )
538+ writer. write ( " row.optionallyEmbedded(at: start + " , index. description)
539+ if model. requiresAdapters {
540+ writer. write ( " , adapters: adapters " )
541+ }
542+ writer. write ( " ) " )
513543 index += model. fields. count
514544 case let . encoded( storage, _, adapter) :
515545 writer. write ( " row.value(at: start + " , index. description, " , using: adapters. " , adapter, " , storage: " , typeName ( for: storage) , " .self) " )
0 commit comments