// // Review+Codable.swift // ReviewsiTunesKit // // Created by Javier Cicchelli on 17/03/2024. // Copyright © 2024 Röck+Cöde VoF. All rights reserved. // import Foundation import ReviewsFeedKit // MARK: - Decodable extension Review: Decodable { // MARK: Enumerations enum ReviewKeys: String, CodingKey { case author case content case id case rating = "im:rating" case title case updated case version = "im:version" } enum NameKeys: String, CodingKey { case name } enum LabelKeys: String, CodingKey { case label } // MARK: Initialisers public init(from decoder: any Decoder) throws { let review = try decoder.container(keyedBy: ReviewKeys.self) let authorName = try review.nestedContainer(keyedBy: NameKeys.self, forKey: .author) let authorLabel = try authorName.nestedContainer(keyedBy: LabelKeys.self, forKey: .name) let contentLabel = try review.nestedContainer(keyedBy: LabelKeys.self, forKey: .content) let idLabel = try review.nestedContainer(keyedBy: LabelKeys.self, forKey: .id) let ratingLabel = try review.nestedContainer(keyedBy: LabelKeys.self, forKey: .rating) let titleLabel = try review.nestedContainer(keyedBy: LabelKeys.self, forKey: .title) let versionLabel = try review.nestedContainer(keyedBy: LabelKeys.self, forKey: .version) let updatedLabel = try review.nestedContainer(keyedBy: LabelKeys.self, forKey: .updated) self.init( id: Int(try idLabel.decode(String.self, forKey: .label)) ?? 0, author: try authorLabel.decode(String.self, forKey: .label), title: try titleLabel.decode(String.self, forKey: .label), content: try contentLabel.decode(String.self, forKey: .label), rating: Int(try ratingLabel.decode(String.self, forKey: .label)) ?? 0, version: try versionLabel.decode(String.self, forKey: .label), updated: try updatedLabel.decode(Date.self, forKey: .label) ) } } // MARK: - Encodable extension Review: Encodable { // MARK: Functions public func encode(to encoder: any Encoder) throws { var review = encoder.container(keyedBy: ReviewKeys.self) var authorName = review.nestedContainer(keyedBy: NameKeys.self, forKey: .author) var authorLabel = authorName.nestedContainer(keyedBy: LabelKeys.self, forKey: .name) var contentLabel = review.nestedContainer(keyedBy: LabelKeys.self, forKey: .content) var idLabel = review.nestedContainer(keyedBy: LabelKeys.self, forKey: .id) var ratingLabel = review.nestedContainer(keyedBy: LabelKeys.self, forKey: .rating) var titleLabel = review.nestedContainer(keyedBy: LabelKeys.self, forKey: .title) var versionLabel = review.nestedContainer(keyedBy: LabelKeys.self, forKey: .version) var updatedLabel = review.nestedContainer(keyedBy: LabelKeys.self, forKey: .updated) try authorLabel.encode(author, forKey: .label) try contentLabel.encode(content, forKey: .label) try idLabel.encode(String(id), forKey: .label) try ratingLabel.encode(String(rating), forKey: .label) try titleLabel.encode(title, forKey: .label) try versionLabel.encode(version, forKey: .label) try updatedLabel.encode(updated, forKey: .label) } }