@@ -105,7 +105,7 @@ public struct SwiftLanguage: Language {
105105 for query in allQueries {
106106 typeAlias ( for: query)
107107
108- if let input = query. input, case let . model( model) = input {
108+ if let input = query. input, case let . model( model, _ ) = input {
109109 inputExtension ( for: query, input: model)
110110 }
111111 }
@@ -321,7 +321,7 @@ public struct SwiftLanguage: Language {
321321 switch input {
322322 case let . builtin( _, isArray, encodedAs) :
323323 bind ( field: nil , encodeToType: encodedAs, isArray: isArray)
324- case . model( let model) :
324+ case . model( let model, _ ) :
325325 for field in model. fields. values {
326326 bind ( field: field. name, encodeToType: field. encodedAsType, isArray: field. isArray)
327327 }
@@ -359,9 +359,9 @@ public struct SwiftLanguage: Language {
359359 for model: GeneratedModel ,
360360 isOutput: Bool
361361 ) {
362- let dynamicLookupTables = model. fields. values. compactMap { value -> ( String , GeneratedModel ) ? in
363- guard case let . model( model) = value. type else { return nil }
364- return ( value. name, model)
362+ let dynamicLookupTables = model. fields. values. compactMap { value -> ( String , GeneratedModel , Bool ) ? in
363+ guard case let . model( model, isOptional ) = value. type else { return nil }
364+ return ( value. name, model, isOptional )
365365 }
366366
367367 let addDynamicLookup = isOutput && !dynamicLookupTables. isEmpty && model. fields. count > 1
@@ -391,15 +391,31 @@ public struct SwiftLanguage: Language {
391391 }
392392
393393 if isOutput {
394+ writer. blankLine ( )
395+
396+ writer. write ( line: " static var nonOptionalIndices: [Int32] { [ " )
397+ for (position, index) in model. nonOptionalIndices. positional ( ) {
398+ writer. write ( index. description)
399+
400+ if !position. isLast {
401+ writer. write ( " , " )
402+ }
403+ }
404+ writer. write ( " ] } " )
405+
394406 writer. blankLine ( )
395407 rowDecodableInit ( for: model)
396408 writer. blankLine ( )
397409 memberWiseInit ( for: model)
398410 }
399411
400412 if addDynamicLookup {
401- for (fieldName, table) in dynamicLookupTables {
402- dynamicMemberLookup ( fieldName: fieldName, typeName: table. name)
413+ for (fieldName, table, isOptional) in dynamicLookupTables {
414+ dynamicMemberLookup (
415+ fieldName: fieldName,
416+ typeName: table. name,
417+ isOptional: isOptional
418+ )
403419 }
404420 }
405421
@@ -409,30 +425,37 @@ public struct SwiftLanguage: Language {
409425 }
410426
411427 private func modelsFor( query: GeneratedQuery ) {
412- if case let . model( model) = query. input, !model. isTable {
428+ if case let . model( model, _ ) = query. input, !model. isTable {
413429 declaration ( for: model, isOutput: false )
414430 }
415431
416- if case let . model( model) = query. output, !model. isTable {
432+ if case let . model( model, _ ) = query. output, !model. isTable {
417433 declaration ( for: model, isOutput: true )
418434 }
419435 }
420436
421437 private func dynamicMemberLookup(
422438 fieldName: String ,
423- typeName: String
439+ typeName: String ,
440+ isOptional: Bool
424441 ) {
425442 writer. newline ( )
426443 writer. write ( line: " subscript<Value>(dynamicMember dynamicMember: " )
427- writer. write ( " KeyPath< " , typeName, " , Value>) -> Value " )
444+ writer. write ( " KeyPath< " , typeName, " , Value>) -> Value " )
445+ if isOptional {
446+ writer. write ( " ? " )
447+ }
448+ writer. write ( " " )
428449 writer. braces {
429- writer. write ( line: " self. " , fieldName, " [keyPath: dynamicMember] " )
450+ writer. write ( line: " self. " , fieldName)
451+ if isOptional {
452+ writer. write ( " ? " )
453+ }
454+ writer. write ( " [keyPath: dynamicMember] " )
430455 }
431456 }
432457
433- private func rowDecodableInit(
434- for model: GeneratedModel
435- ) {
458+ private func rowDecodableInit( for model: GeneratedModel ) {
436459 // Initializer signature
437460 writer. write ( line: " init( " )
438461 writer. indent ( )
@@ -464,9 +487,13 @@ public struct SwiftLanguage: Language {
464487 }
465488
466489 index += 1
467- case . model( let model) :
468- // Model initializer
469- writer. write ( field. type. description, " (row: row, startingAt: start + " , index. description, " ) " )
490+ case let . model( model, isOptional) :
491+ if isOptional {
492+ let type = field. type. description. replacingOccurrences ( of: " ? " , with: " " )
493+ writer. write ( type, " (row: row, optionallyAt: start + " , index. description, " ) " )
494+ } else {
495+ writer. write ( field. type. description, " (row: row, startingAt: start + " , index. description, " ) " )
496+ }
470497 index += model. fields. count
471498 }
472499 }
0 commit comments