@@ -478,96 +478,77 @@ public enum RenderBlockContent: Equatable {
478
478
// Writing a manual Codable implementation for tables because the encoding of `extendedData` does
479
479
// not follow from the struct layout.
480
480
extension RenderBlockContent . Table : Codable {
481
- // `extendedData` is encoded as a keyed container where the "keys" are the cell index, and
482
- // the "values" are the remaining fields in the struct. The key is formatted as a string with
483
- // the format "{row}_{column}", which is represented here as the `.index(row:column:)` enum
484
- // case. This CodingKey implementation performs that parsing and formatting so that the
485
- // Encodable/Decodable implementation can use the plain numbered indices.
486
- enum CodingKeys : CodingKey , Equatable {
481
+ enum CodingKeys : String , CodingKey {
487
482
case header, rows, extendedData, metadata
488
- case index( row: Int , column: Int )
489
- case colspan, rowspan
483
+ }
490
484
491
- var stringValue : String {
492
- switch self {
493
- case . header: return " header "
494
- case . rows: return " rows "
495
- case . extendedData: return " extendedData "
496
- case . metadata: return " metadata "
497
- case . colspan: return " colspan "
498
- case . rowspan: return " rowspan "
499
- case let . index( row, column) : return " \( row) _ \( column) "
500
- }
485
+ // TableCellExtendedData encodes the row and column indices as a dynamic key with the format "{row}_{column}".
486
+ struct DynamicIndexCodingKey : CodingKey , Equatable {
487
+ let row , column : Int
488
+ init ( row: Int , column: Int ) {
489
+ self . row = row
490
+ self . column = column
501
491
}
502
492
493
+ var stringValue : String {
494
+ return " \( row) _ \( column) "
495
+ }
503
496
init ? ( stringValue: String ) {
504
- switch stringValue {
505
- case " header " : self = . header
506
- case " rows " : self = . rows
507
- case " extendedData " : self = . extendedData
508
- case " metadata " : self = . metadata
509
- case " colspan " : self = . colspan
510
- case " rowspan " : self = . rowspan
511
- default :
512
- let coordinates = stringValue. split ( separator: " _ " )
513
- guard coordinates. count == 2 ,
514
- let rowIndex = Int ( coordinates. first!) ,
515
- let columnIndex = Int ( coordinates. last!) else {
516
- return nil
517
- }
518
- self = . index( row: rowIndex, column: columnIndex)
497
+ let coordinates = stringValue. split ( separator: " _ " )
498
+ guard coordinates. count == 2 ,
499
+ let rowIndex = Int ( coordinates. first!) ,
500
+ let columnIndex = Int ( coordinates. last!) else {
501
+ return nil
519
502
}
503
+ row = rowIndex
504
+ column = columnIndex
520
505
}
521
-
506
+ // The key is only represented by a string value
522
507
var intValue : Int ? { nil }
508
+ init ? ( intValue: Int ) { nil }
509
+ }
523
510
524
- init ? ( intValue: Int ) {
525
- return nil
526
- }
511
+ enum ExtendedDataCodingKeys : String , CodingKey {
512
+ case colspan, rowspan
527
513
}
528
514
529
515
public init ( from decoder: Decoder ) throws {
530
516
let container = try decoder. container ( keyedBy: CodingKeys . self)
531
517
518
+ self . header = try container. decode ( RenderBlockContent . HeaderType. self, forKey: . header)
519
+ self . rows = try container. decode ( [ RenderBlockContent . TableRow ] . self, forKey: . rows)
520
+ self . metadata = try container. decodeIfPresent ( RenderContentMetadata . self, forKey: . metadata)
521
+
532
522
var extendedData = Set < RenderBlockContent . TableCellExtendedData > ( )
533
- if container. allKeys . contains ( . extendedData) {
534
- let dataContainer = try container. nestedContainer ( keyedBy: CodingKeys . self, forKey: . extendedData)
523
+ if container. contains ( . extendedData) {
524
+ let dataContainer = try container. nestedContainer ( keyedBy: DynamicIndexCodingKey . self, forKey: . extendedData)
535
525
536
526
for index in dataContainer. allKeys {
537
- guard case let . index( row, column) = index else { continue }
538
-
539
- let cellContainer = try dataContainer. nestedContainer ( keyedBy: CodingKeys . self, forKey: index)
540
- extendedData. insert ( . init( rowIndex: row,
541
- columnIndex: column,
527
+ let cellContainer = try dataContainer. nestedContainer ( keyedBy: ExtendedDataCodingKeys . self, forKey: index)
528
+ extendedData. insert ( . init( rowIndex: index. row,
529
+ columnIndex: index. column,
542
530
colspan: try cellContainer. decode ( UInt . self, forKey: . colspan) ,
543
531
rowspan: try cellContainer. decode ( UInt . self, forKey: . rowspan) ) )
544
532
}
545
533
}
546
-
547
- self = . init( header: try container. decode ( RenderBlockContent . HeaderType. self, forKey: . header) ,
548
- rows: try container. decode ( [ RenderBlockContent . TableRow ] . self, forKey: . rows) ,
549
- extendedData: extendedData,
550
- metadata: try container. decodeIfPresent ( RenderContentMetadata . self, forKey: . metadata) )
534
+ self . extendedData = extendedData
551
535
}
552
536
553
537
public func encode( to encoder: Encoder ) throws {
554
538
var container = encoder. container ( keyedBy: CodingKeys . self)
555
-
556
539
try container. encode ( header, forKey: . header)
557
540
try container. encode ( rows, forKey: . rows)
541
+ try container. encodeIfPresent ( metadata, forKey: . metadata)
558
542
559
543
if !extendedData. isEmpty {
560
- var dataContainer = container. nestedContainer ( keyedBy: CodingKeys . self, forKey: . extendedData)
544
+ var dataContainer = container. nestedContainer ( keyedBy: DynamicIndexCodingKey . self, forKey: . extendedData)
561
545
for data in extendedData {
562
- var cellContainer = dataContainer. nestedContainer ( keyedBy: CodingKeys . self,
563
- forKey: . index( row: data. rowIndex,
564
- column: data. columnIndex) )
546
+ var cellContainer = dataContainer. nestedContainer ( keyedBy: ExtendedDataCodingKeys . self,
547
+ forKey: . init( row: data. rowIndex, column: data. columnIndex) )
565
548
try cellContainer. encode ( data. colspan, forKey: . colspan)
566
549
try cellContainer. encode ( data. rowspan, forKey: . rowspan)
567
550
}
568
551
}
569
-
570
- try container. encodeIfPresent ( metadata, forKey: . metadata)
571
552
}
572
553
}
573
554
0 commit comments