This PR contains the work done to address the issue #7, related to documenting the source code that would be used for other developers. To provide further details about the work done: - [x] restructured the hierarchy of some models that are related to the `Amiibo` model; - [x] written documentation for the `AmiiboService` service; - [x] written documentation for the `AmiiboFilter` and `KeyNameFilter` filters; - [x] written documentation for the `Amiibo`, `KeyName`, `LastUpdated` and children model; - [x] written documentation for the `AmiiboClientError` error; - [x] written documentation for the README file. Co-authored-by: Javier Cicchelli <javier@rock-n-code.com> Reviewed-on: #10
111 lines
3.8 KiB
Swift
111 lines
3.8 KiB
Swift
/// This model struct represents an amiibo that is retrieved from the respective [remote API endpoint](https://www.amiiboapi.com/docs/#amiibo).
|
|
public struct Amiibo {
|
|
|
|
// MARK: Properties
|
|
|
|
/// The type the amiibo belongs to.
|
|
public let type: String
|
|
|
|
/// The first 8 values of the hexadecimal that identifies the amiibo.
|
|
public let head: String
|
|
|
|
/// The last 8 values of the hexadecimal that identifies the amiibo.
|
|
public let tail: String
|
|
|
|
/// The name of the amiibo.
|
|
public let name: String
|
|
|
|
/// The character of the amiibo.
|
|
public let character: String
|
|
|
|
/// The series the amiibo belongs to.
|
|
public let series: String
|
|
|
|
/// The game series of the amiibo.
|
|
public let gameSeries: String
|
|
|
|
/// The URL to an image of the amiibo.
|
|
public let image: String
|
|
|
|
/// The release dates of the amiibo (if released) in Australia, Europe, Japan and North America.
|
|
public let release: Release
|
|
|
|
/// The games related to the amiibo, if requested.
|
|
public let games: Games?
|
|
}
|
|
|
|
// MARK: - Structs
|
|
|
|
extension Amiibo {
|
|
/// This model represents the list of games related to a particular amiibo, grouped by system.
|
|
public struct Games: Decodable {
|
|
|
|
// MARK: Properties
|
|
|
|
/// A list of [Nintendo 3DS system](https://en.wikipedia.org/wiki/Nintendo_3DS) games the amiibo can be used with.
|
|
public let n3ds: [Game]
|
|
|
|
/// A list of [Nintendo WiiU system](https://en.wikipedia.org/wiki/Wii_U) games the amiibo can be used with.
|
|
public let wiiu: [Game]
|
|
|
|
/// /// A list of [Nintendo Switch system](https://en.wikipedia.org/wiki/Nintendo_Switch) games the amiibo can be used with.
|
|
public let `switch`: [Game]
|
|
}
|
|
}
|
|
|
|
// MARK: - Decodable
|
|
|
|
extension Amiibo: Decodable {
|
|
|
|
// MARK: Enumerations
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case type
|
|
case head
|
|
case tail
|
|
case name
|
|
case character
|
|
case series = "amiiboSeries"
|
|
case gameSeries
|
|
case image
|
|
case release
|
|
case games3DS
|
|
case gamesWiiU
|
|
case gamesSwitch
|
|
}
|
|
|
|
// MARK: Initialisers
|
|
|
|
/// Initialises this model by decoding from the given decoder.
|
|
/// - Parameter decoder: The decoder to read data from.
|
|
/// - Throws: A `DecodingError` error in case the decode failed at decoding data into an expected model type.
|
|
public init(from decoder: Decoder) throws {
|
|
let container = try decoder.container(keyedBy: CodingKeys.self)
|
|
let games3ds = try container.decodeIfPresent([Game].self, forKey: .games3DS)
|
|
let gamesWiiU = try container.decodeIfPresent([Game].self, forKey: .gamesWiiU)
|
|
let gamesSwitch = try container.decodeIfPresent([Game].self, forKey: .gamesSwitch)
|
|
|
|
self.type = try container.decode(String.self, forKey: .type)
|
|
self.head = try container.decode(String.self, forKey: .head)
|
|
self.tail = try container.decode(String.self, forKey: .tail)
|
|
self.name = try container.decode(String.self, forKey: .name)
|
|
self.character = try container.decode(String.self, forKey: .character)
|
|
self.series = try container.decode(String.self, forKey: .series)
|
|
self.gameSeries = try container.decode(String.self, forKey: .gameSeries)
|
|
self.image = try container.decode(String.self, forKey: .image)
|
|
self.release = try container.decode(Release.self, forKey: .release)
|
|
self.games = {
|
|
if let games3ds, let gamesWiiU, let gamesSwitch {
|
|
return .init(
|
|
n3ds: games3ds,
|
|
wiiu: gamesWiiU,
|
|
switch: gamesSwitch
|
|
)
|
|
} else {
|
|
return nil
|
|
}
|
|
}()
|
|
}
|
|
|
|
}
|