Improved the overall documentation for the public and internal types in the package.
This commit is contained in:
@@ -12,7 +12,7 @@
|
|||||||
//
|
//
|
||||||
// ===----------------------------------------------------------------------===
|
// ===----------------------------------------------------------------------===
|
||||||
|
|
||||||
/// A protocol that defines filters that might contain `key` and/or `name` values.
|
/// A protocol that defines filters containing optional `key` and/or `name` values for querying resources.
|
||||||
protocol KeyNameFilter {
|
protocol KeyNameFilter {
|
||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
|
|||||||
@@ -12,15 +12,15 @@
|
|||||||
//
|
//
|
||||||
// ===----------------------------------------------------------------------===
|
// ===----------------------------------------------------------------------===
|
||||||
|
|
||||||
/// A protocol that defines decodable models containing the `key` and `name` properties.
|
/// A protocol that defines models containing a `key` and `name` pair.
|
||||||
protocol KeyNameModel: Sendable, Hashable {
|
protocol KeyNameModel: Sendable, Hashable {
|
||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
|
|
||||||
/// A key.
|
/// A hexadecimal key that uniquely identifies this model.
|
||||||
var key: String { get }
|
var key: String { get }
|
||||||
|
|
||||||
/// A name.
|
/// A display name for this model.
|
||||||
var name: String { get }
|
var name: String { get }
|
||||||
|
|
||||||
// MARK: Initializers
|
// MARK: Initializers
|
||||||
|
|||||||
@@ -31,10 +31,16 @@ extension ISOTimestampTranscoder: DateTranscoder {
|
|||||||
|
|
||||||
// MARK: Functions
|
// MARK: Functions
|
||||||
|
|
||||||
|
/// Encodes a date into an ISO timestamp string.
|
||||||
|
/// - Parameter date: A date to encode.
|
||||||
|
/// - Returns: A string representation of the date in `yyyy-MM-dd'T'HH:mm:ss.SSSSSS` format.
|
||||||
func encode(_ date: Date) throws -> String {
|
func encode(_ date: Date) throws -> String {
|
||||||
dateFormatter.string(from: date)
|
dateFormatter.string(from: date)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Decodes an ISO timestamp string into a date.
|
||||||
|
/// - Parameter string: A string to decode.
|
||||||
|
/// - Returns: A date parsed from the string, or the Unix epoch if the string cannot be parsed.
|
||||||
func decode(_ string: String) throws -> Date {
|
func decode(_ string: String) throws -> Date {
|
||||||
dateFormatter.date(from: string) ?? .init()
|
dateFormatter.date(from: string) ?? .init()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,18 +16,18 @@ import Foundation
|
|||||||
import OpenAPIRuntime
|
import OpenAPIRuntime
|
||||||
import OpenAPIURLSession
|
import OpenAPIURLSession
|
||||||
|
|
||||||
/// A type that implements a live client to the online service.
|
/// A type that implements a live client to the [Amiibo API](https://www.amiiboapi.org) online service.
|
||||||
public struct AmiiboLiveClient: Sendable {
|
public struct AmiiboLiveClient: Sendable {
|
||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
|
|
||||||
/// A client generated by the `OpenAPIRuntime` library.
|
/// A client generated by the OpenAPI Runtime library to perform API calls.
|
||||||
private let client: Client
|
private let client: Client
|
||||||
|
|
||||||
// MARK: Initializers
|
// MARK: Initializers
|
||||||
|
|
||||||
/// Initializes this client.
|
/// Initializes this client with a transport for performing HTTP operations.
|
||||||
/// - Parameter transport: A transport that performs HTTP operations.
|
/// - Parameter transport: A transport that performs HTTP operations. Defaults to a `URLSessionTransport` using the shared session.
|
||||||
public init(transport: any ClientTransport = URLSessionTransport()) {
|
public init(transport: any ClientTransport = URLSessionTransport()) {
|
||||||
self.client = .init(
|
self.client = .init(
|
||||||
// The force unwrapping implemented below assumes that the server definition from the OpenAPI specification is correct.
|
// The force unwrapping implemented below assumes that the server definition from the OpenAPI specification is correct.
|
||||||
@@ -415,9 +415,9 @@ private extension AmiiboLiveClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Maps a given error to a `AmiiboServiceError` error.
|
/// Maps a given error to an ``AmiiboServiceError`` error.
|
||||||
/// - Parameter error: An error to map.
|
/// - Parameter error: An error to map.
|
||||||
/// - Throws: An ``AmiiboServiceError`` error.
|
/// - Throws: An ``AmiiboServiceError`` error that corresponds to the given error.
|
||||||
func handle(error: any Error) throws -> Never {
|
func handle(error: any Error) throws -> Never {
|
||||||
switch error {
|
switch error {
|
||||||
case is CancellationError:
|
case is CancellationError:
|
||||||
|
|||||||
@@ -14,19 +14,19 @@
|
|||||||
|
|
||||||
/// A representation of all the possible errors that the ``AmiiboService`` service could throw.
|
/// A representation of all the possible errors that the ``AmiiboService`` service could throw.
|
||||||
public enum AmiiboServiceError: Error {
|
public enum AmiiboServiceError: Error {
|
||||||
/// A bad request has been given to the client.
|
/// The request was malformed or contained invalid filter parameters.
|
||||||
case badRequest
|
case badRequest
|
||||||
/// A call to an endpoint has been cancelled by the user.
|
/// The request was cancelled before a response was received.
|
||||||
case cancelled
|
case cancelled
|
||||||
/// A response cannot be decoded.
|
/// The response body could not be decoded into the expected model.
|
||||||
case decoding
|
case decoding
|
||||||
/// An online service is not currently available.
|
/// The backend service is currently unreachable due to a network or server issue.
|
||||||
case notAvailable
|
case notAvailable
|
||||||
/// A response cannot be found.
|
/// No results were found matching the given filter criteria.
|
||||||
case notFound
|
case notFound
|
||||||
/// An undocumented/unsupported status code error.
|
/// The server returned an undocumented HTTP status code.
|
||||||
case undocumented(_ statusCode: Int)
|
case undocumented(_ statusCode: Int)
|
||||||
/// An unknown error.
|
/// An unexpected error that does not fall into any other category.
|
||||||
case unknown
|
case unknown
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -19,34 +19,34 @@ public struct Amiibo: Sendable, Hashable {
|
|||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
|
|
||||||
/// A game character.
|
/// The name of the game character associated with this amiibo.
|
||||||
public let gameCharacter: String
|
public let gameCharacter: String
|
||||||
|
|
||||||
/// A game series.
|
/// The name of the game series associated with this amiibo.
|
||||||
public let gameSeries: String
|
public let gameSeries: String
|
||||||
|
|
||||||
/// The first 8 hexadecimal characters of an identifier.
|
/// The first 8 hexadecimal characters of the amiibo identifier.
|
||||||
public let head: String
|
public let head: String
|
||||||
|
|
||||||
/// An image link.
|
/// A URL string pointing to the image of this amiibo.
|
||||||
public let image: String
|
public let image: String
|
||||||
|
|
||||||
/// An amiibo name.
|
/// The name of this amiibo.
|
||||||
public let name: String
|
public let name: String
|
||||||
|
|
||||||
/// A game platform type, if any.
|
/// The game platform data for this amiibo, if available.
|
||||||
public let platform: Platform?
|
public let platform: Platform?
|
||||||
|
|
||||||
/// A release date.
|
/// The release dates of this amiibo across different regions.
|
||||||
public let release: Release
|
public let release: Release
|
||||||
|
|
||||||
/// An amiibo series.
|
/// The name of the amiibo series this amiibo belongs to.
|
||||||
public let series: String
|
public let series: String
|
||||||
|
|
||||||
/// The last 8 hexadecimal characters of an identifier.
|
/// The last 8 hexadecimal characters of the amiibo identifier.
|
||||||
public let tail: String
|
public let tail: String
|
||||||
|
|
||||||
/// An amiibo type.
|
/// The type of this amiibo (e.g., Figure, Card, Yarn, Band).
|
||||||
public let type: String
|
public let type: String
|
||||||
|
|
||||||
// MARK: Initializers
|
// MARK: Initializers
|
||||||
@@ -73,12 +73,12 @@ public struct Amiibo: Sendable, Hashable {
|
|||||||
|
|
||||||
// MARK: Computed
|
// MARK: Computed
|
||||||
|
|
||||||
/// An identifier.
|
/// The full 16-character hexadecimal identifier, composed of the ``head`` and ``tail``.
|
||||||
public var identifier: String {
|
public var identifier: String {
|
||||||
head + tail
|
head + tail
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A URL related to an image link, if any.
|
/// A URL constructed from the ``image`` string, if valid.
|
||||||
public var imageURL: URL? {
|
public var imageURL: URL? {
|
||||||
.init(string: image)
|
.init(string: image)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,13 +18,13 @@ extension Amiibo {
|
|||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
|
|
||||||
/// A list of identifiers.
|
/// A list of game identifiers associated with this game.
|
||||||
public let identifiers: [String]
|
public let identifiers: [String]
|
||||||
|
|
||||||
/// A name.
|
/// The name of this game.
|
||||||
public let name: String
|
public let name: String
|
||||||
|
|
||||||
/// A list of amiibo usages, if any.
|
/// A list of amiibo usages within this game, if available.
|
||||||
public let usages: [Usage]?
|
public let usages: [Usage]?
|
||||||
|
|
||||||
// MARK: Initializers
|
// MARK: Initializers
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
// ===----------------------------------------------------------------------===
|
// ===----------------------------------------------------------------------===
|
||||||
|
|
||||||
extension Amiibo {
|
extension Amiibo {
|
||||||
/// A model that represents a collection of `Switch`, `Switch 2`, `3DS`, and `WiiU` games related to an amiibo.
|
/// A model that represents a collection of `Switch`, `Switch 2`, `3DS`, and `Wii U` games related to an amiibo.
|
||||||
public struct Platform: Sendable, Hashable {
|
public struct Platform: Sendable, Hashable {
|
||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
@@ -27,7 +27,7 @@ extension Amiibo {
|
|||||||
/// A list of `3DS` games related to an amiibo.
|
/// A list of `3DS` games related to an amiibo.
|
||||||
public let threeDS: [Game]
|
public let threeDS: [Game]
|
||||||
|
|
||||||
/// A list of `WiiU` games related to an amiibo.
|
/// A list of `Wii U` games related to an amiibo.
|
||||||
public let wiiU: [Game]
|
public let wiiU: [Game]
|
||||||
|
|
||||||
// MARK: Initializers
|
// MARK: Initializers
|
||||||
@@ -40,7 +40,7 @@ extension Amiibo {
|
|||||||
/// - switch: A list of `Switch` games related to an amiibo, if any.
|
/// - switch: A list of `Switch` games related to an amiibo, if any.
|
||||||
/// - switch2: A list of `Switch 2` games related to an amiibo, if any.
|
/// - switch2: A list of `Switch 2` games related to an amiibo, if any.
|
||||||
/// - threeDS: A list of `3DS` games related to an amiibo, if any.
|
/// - threeDS: A list of `3DS` games related to an amiibo, if any.
|
||||||
/// - wiiU: A list of `WiiU` games related to an amiibo, if any.
|
/// - wiiU: A list of `Wii U` games related to an amiibo, if any.
|
||||||
init?(
|
init?(
|
||||||
_ `switch`: [Components.Schemas.AmiiboGame]?,
|
_ `switch`: [Components.Schemas.AmiiboGame]?,
|
||||||
_ switch2: [Components.Schemas.AmiiboGame]?,
|
_ switch2: [Components.Schemas.AmiiboGame]?,
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
extension Amiibo {
|
extension Amiibo {
|
||||||
/// A model that represents a collection of release dates related to an amiibo.
|
/// A model that represents the regional release dates of an amiibo.
|
||||||
public struct Release: Sendable, Hashable {
|
public struct Release: Sendable, Hashable {
|
||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
|
|||||||
@@ -18,10 +18,10 @@ extension Amiibo {
|
|||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
|
|
||||||
/// An explanation of how to use an amiibo.
|
/// A description of how the amiibo is used within the game.
|
||||||
public let explanation: String
|
public let explanation: String
|
||||||
|
|
||||||
/// A flag that indicates whether an amiibo can save game data in it.
|
/// A flag that indicates whether the amiibo can save game data.
|
||||||
public let isWriteable: Bool
|
public let isWriteable: Bool
|
||||||
|
|
||||||
// MARK: Initializers
|
// MARK: Initializers
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ public struct AmiiboSeries: KeyNameModel {
|
|||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
|
|
||||||
/// An amiibo series key.
|
/// The hexadecimal key that uniquely identifies this amiibo series.
|
||||||
public let key: String
|
public let key: String
|
||||||
|
|
||||||
/// An amiibo series name.
|
/// The name of this amiibo series.
|
||||||
public let name: String
|
public let name: String
|
||||||
|
|
||||||
// MARK: Initializers
|
// MARK: Initializers
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ public struct AmiiboType: KeyNameModel {
|
|||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
|
|
||||||
/// An amiibo type key.
|
/// The hexadecimal key that uniquely identifies this amiibo type.
|
||||||
public let key: String
|
public let key: String
|
||||||
|
|
||||||
/// An amiibo type name.
|
/// The name of this amiibo type (e.g., Figure, Card, Yarn, Band).
|
||||||
public let name: String
|
public let name: String
|
||||||
|
|
||||||
// MARK: Initializers
|
// MARK: Initializers
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ public struct GameCharacter: KeyNameModel {
|
|||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
|
|
||||||
/// A game character key.
|
/// The hexadecimal key that uniquely identifies this game character.
|
||||||
public let key: String
|
public let key: String
|
||||||
|
|
||||||
/// A game character name.
|
/// The name of this game character.
|
||||||
public let name: String
|
public let name: String
|
||||||
|
|
||||||
// MARK: Initializers
|
// MARK: Initializers
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ public struct GameSeries: KeyNameModel {
|
|||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
|
|
||||||
/// A game series key.
|
/// The hexadecimal key that uniquely identifies this game series.
|
||||||
public let key: String
|
public let key: String
|
||||||
|
|
||||||
/// A game series name.
|
/// The name of this game series.
|
||||||
public let name: String
|
public let name: String
|
||||||
|
|
||||||
// MARK: Initializers
|
// MARK: Initializers
|
||||||
|
|||||||
@@ -15,30 +15,30 @@
|
|||||||
import AmiiboService
|
import AmiiboService
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
/// A type that implements a mock client, for testing purposes.
|
/// A mock implementation of ``AmiiboClient`` that returns pre-configured data or throws pre-configured errors, for testing purposes.
|
||||||
struct AmiiboMockClient {
|
struct AmiiboMockClient {
|
||||||
|
|
||||||
// MARK: Properties
|
// MARK: Properties
|
||||||
|
|
||||||
/// A list of amiibo items to return, if any.
|
/// The list of amiibo items to return when ``getAmiibos(by:)`` is called, or `nil` to trigger a ``AmiiboServiceError/notFound`` error.
|
||||||
private let amiibos: [Amiibo]?
|
private let amiibos: [Amiibo]?
|
||||||
|
|
||||||
/// A list of amiibo series to return, if any.
|
/// The list of amiibo series to return when ``getAmiiboSeries(by:)`` is called, or `nil` to trigger a ``AmiiboServiceError/notFound`` error.
|
||||||
private let amiiboSeries: [AmiiboSeries]?
|
private let amiiboSeries: [AmiiboSeries]?
|
||||||
|
|
||||||
/// A list of amiibo types to return, if any.
|
/// The list of amiibo types to return when ``getAmiiboTypes(by:)`` is called, or `nil` to trigger a ``AmiiboServiceError/notFound`` error.
|
||||||
private let amiiboTypes: [AmiiboType]?
|
private let amiiboTypes: [AmiiboType]?
|
||||||
|
|
||||||
/// An error to throw, if any.
|
/// An error to throw before returning any data. Takes precedence over stored data when set.
|
||||||
private let error: AmiiboServiceError?
|
private let error: AmiiboServiceError?
|
||||||
|
|
||||||
/// A list of game characters to return, if any.
|
/// The list of game characters to return when ``getGameCharacters(by:)`` is called, or `nil` to trigger a ``AmiiboServiceError/notFound`` error.
|
||||||
private let gameCharacters: [GameCharacter]?
|
private let gameCharacters: [GameCharacter]?
|
||||||
|
|
||||||
/// A list of game series to return, if any.
|
/// The list of game series to return when ``getGameSeries(by:)`` is called, or `nil` to trigger a ``AmiiboServiceError/notFound`` error.
|
||||||
private let gameSeries: [GameSeries]?
|
private let gameSeries: [GameSeries]?
|
||||||
|
|
||||||
/// A last updated date to return, if any.
|
/// The last updated date to return when ``getLastUpdated()`` is called, or `nil` to trigger a ``AmiiboServiceError/notFound`` error.
|
||||||
private let lastUpdated: Date?
|
private let lastUpdated: Date?
|
||||||
|
|
||||||
// MARK: Initializers
|
// MARK: Initializers
|
||||||
@@ -234,8 +234,8 @@ private extension AmiiboMockClient {
|
|||||||
return lastUpdated
|
return lastUpdated
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Throws an error if it has been provided,
|
/// Throws the configured error if one has been provided.
|
||||||
/// - Throws: An ``AmiiboServiceError`` error in case an error has been provided.
|
/// - Throws: An ``AmiiboServiceError`` error if one was configured during initialization.
|
||||||
func throwErrorIfExists() throws(AmiiboServiceError) {
|
func throwErrorIfExists() throws(AmiiboServiceError) {
|
||||||
if let error {
|
if let error {
|
||||||
throw error
|
throw error
|
||||||
|
|||||||
Reference in New Issue
Block a user