This PR contains the work done to implement the `iTunesService` service that fetches the reviews from the **Apple App Store**. Reviewed-on: #5 Co-authored-by: Javier Cicchelli <javier@rock-n-code.com> Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
85 lines
3.4 KiB
Swift
85 lines
3.4 KiB
Swift
//
|
|
// 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)
|
|
}
|
|
|
|
}
|