Compare commits

14 Commits
Author SHA1 Message Date
javier 4cbac015b1 Some fixes to the live test suite (#32)
CI / Build and test (push) Canceled after 0s
Documentation / Build documentation (push) Canceled after 0s
Documentation / Deploy to GitHub Pages (push) Canceled after 0s
This PR contains the work done to fix the live test suite, which started failing once the Amiibo API began returning Switch 2 games, and tidies the test suite around it.

### Changes

- **Live tests:** replaced the assertion that the first amiibo has no Switch 2 games with a usage check, matching the other platforms. The live data now includes Switch 2 entries for most amiibos.
- **Live tests:** refreshed the minimum item counts and the earliest accepted last-updated date to the values observed in October 2026, and documented in the README how to refresh them.
- **All tests:** moved test descriptions from `@Test("...")` strings into backticked function names, and aligned every case on the same GIVEN/WHEN/THEN structure.
- **Live client:** replaced the TODO about DocC inherited docs with a note. The compiler does not inherit documentation for protocol witnesses, so the repeated doc comments stay on purpose.

Reviewed-on: #32
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
2026-10-25 21:53:31 +00:00
javier 13b9c74a38 Few fixes and improvements to the library, plus Github Actions setup (#31)
CI / Build and test (push) Canceled after 0s
Documentation / Build documentation (push) Canceled after 0s
Documentation / Deploy to GitHub Pages (push) Canceled after 0s
This PR contains the work done to fix a cancellation-mapping bug in `AmiiboLiveClient`, bring the client under offline test coverage, add the conformances SwiftUI and persistence need, and moves CI and documentation publishing to GitHub Actions. All public API changes are additive.

### Fix

- `AmiiboLiveClient` reported an early task cancellation as `.unknown("CancellationError()")`. The OpenAPI runtime wraps every error in `ClientError`, so the `CancellationError` check never matched; it now also checks the wrapped error and throws `.cancelled`.

### Tests

- `ThrowingTransport` and `StubTransport` test doubles let the live client run offline. New tests cover error mapping, HTTP status → error mapping, `oneOf` object-vs-list decoding, `"amiibo": null`, sorting, filter → query encoding, `Platform`/`Release` mapping, and the date transcoder.
- Models gained `package` memberwise initializers so tests can build real fixtures without `@testable`. These are not public API.
- The test target now depends on `OpenAPIRuntime` and `HTTPTypes` (both already in the dependency graph).

### API
- Models are `Codable` and `Identifiable` (`Amiibo.id` is its `identifier`; the key/name models use `key`).
- Filters are `Hashable`.

### Documentation
- Doc comments trimmed library-wide; one repeated `- Throws:` sentence appeared 24 times. `Library.md` and the README tightened to match.

### CI and docs publishing
- `ci.yml`: build and offline tests on PRs and pushes to `main`.
- `live-tests.yml`: weekly and on-demand run against the live API.
- `docs.yml`: builds DocC on PRs, deploys to GitHub Pages on `main`. Pinned to Xcode 26 because swift-docc-plugin 1.5.0 fails to launch its tools under Xcode 27.
- The generated `docs/` folder (327 files) is removed from the repository and ignored.

Reviewed-on: #31
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
2026-10-25 19:54:30 +00:00
javier 44bfaca553 Improved the documentation throughout the library (#30)
This PR contains the work done to improve the overall documentation effort throughout the library.

Reviewed-on: #30
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
2026-09-14 10:13:41 +00:00
javier aa135cb04a Updated the Package file in the library to relax the "swift-openapi-generator" dependency. (#29)
Reviewed-on: #29
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
2026-09-14 09:41:45 +00:00
javier 0c41e5d4ce Several fixes and optimizations all over the library (#28)
This PR contains the work done to cleans up the library after the Swift 6.2 migration: drops the legacy conditional-compilation paths, hardens the OpenAPI specification, removes boilerplate from the live client, and makes the live test suite resilient to changes in the upstream service data.

* Swift 6.2 baseline
  * Adopted swift-tools-version: 6.2, which allowed removing every #if swift(>=6.0) / #if swift(>=6.2) branch and natural-language test names are now the only code paths.
  * `AmiiboClient` client now refines `Sendable`, and both `AmiiboLiveClient` and `AmiiboService` conform to it, so instances can be shared across concurrency domains.

* Live client
  * Extracted a generic `perform(_:)` helper that wraps every generated API call and funnels transport errors through the existing error mapper — replaces six repeated do/catch blocks and lets the private fetch* methods use typed throws end-to-end.
  * Added the internal `KeyNamePayload` protocol and a generic makeModels(from:), collapsing the four near-identical mapping/sorting blocks for amiibo series, types, game characters and game series into one.
  * The server URL is now resolved once into a static let constant instead of on every initialization.
  * Improved error mapping: URLError.cancelled → .cancelled, .cannotParseResponse → .decoding, and .dataNotAllowed, .internationalRoamingOff, .secureConnectionFailed now map to .notAvailable.
  * Simplified the Amiibo.Platform initializer ([Amiibo+Platform.swift](vscode-webview://1m6rk4uhpaukb4hrbp3j54p77iq693fq2ql7o9oup2pca1omf7f6/Sources/AmiiboService/Public/Models/Amiibo/Amiibo+Platform.swift)) using optional chaining and ?? [] instead of nested guards and immediately-invoked closures.
  * Set the en_US_POSIX locale on both fixed-format date formatters so the user's locale or 12/24-hour setting can no longer break parsing.

* OpenAPI specification
  * Replaced the shared Tuple schema with explicit per-type schemas (AmiiboSeries, AmiiboType, GameCharacter, GameSeries), so the generated code exposes real properties instead of allOf wrappers with .value1 accessors.
  * Extracted named list schemas (AmiiboList, AmiiboSeriesList, …) for the wrapper payloads, which turns the generated .case2 enum cases into readable .AmiiboSeriesList cases.
  * Added validation patterns and length bounds to the id, head, tail and key query parameters, and collapsed the redundant pattern/minLength/maxLength triplets on head/tail into ^[0-9a-fA-F]{8}$.
  * Extracted the shared InternalServerError response, replacing the five inline 500 descriptions.
  * Documented the two non-standard date/time decoding behaviours (date-only strings for release dates, offset-less timestamps for lastUpdated) and why the optional amiibo wrapper property must stay optional.
  * Corrected the info.version value from v1.0.0 to 1.0.0.

* ⚠️ Breaking changes
  *  Minimum Swift version raised from 5.10 to 6.2.
  *  `AmiiboServiceError.unknown` now carries a String description of the underlying error.
  *  `AmiiboClient` requires Sendable conformance, so existing custom mock clients must be Sendable.

Reviewed-on: #28
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2026-07-26 09:56:32 +00:00
javier 1488aa151e Tests updates and other fixes (#27)
This PR contains the work done to update the live test data to its latest version. Plus other improvements have been made:

* conformed the `AmiiboServiceError` error to the `LocalizableError` protocol,
* improved the `ISODateTimeTranscoder` transcoder to handle the decoding of both ISO dates and timestamps,
* removed a force-unwrapped from the `AmiiboLiveClient` type.

Reviewed-on: #27
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2026-03-27 17:14:26 +00:00
javier 2442ada4b6 Documentation update (#26)
This PR contains the work done to update the documentation of the library, keeping it up-to-date.

Reviewed-on: #26
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2026-03-24 01:30:15 +00:00
javier b8c0878ca3 Fixed the "swift-openapi-generator" package dependency to 1.11.0 in the package file to avoid a plugin issue when building from folders with unicode characters. (#25)
Reviewed-on: #25
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2026-03-24 01:19:58 +00:00
javier 61695af072 Improved the summaries and descriptions through the OpenAPI specification document in the library target. (#24)
Reviewed-on: #24
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2026-03-23 00:20:33 +00:00
javier 7e7e194abc Forgot to update the reference to the year on header files of hidden files in the package. (#23)
Reviewed-on: #23
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2026-03-22 23:48:46 +00:00
javier 2b01ec14bf Overall improvements and data update (#22)
This PR contains the work done to update the live tests to the latest data plus lots of QoL improvements to the library, including:

* added test cases to test the ``AmiiboService` locally;
* conformed the models to the `Hashable` protocol;
* documented the use of caching with the `AmiiboService` service;
* updated the reference to the new AmiiboAPI url;
* updated the year on the copyrights and header files;
* updated the overall documentation of the source code and the package.

Reviewed-on: #22
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2026-03-22 23:39:48 +00:00
javier fae4b44698 Added support for Switch 2 games to the Amiibo type. (#21)
This PR contains the work done to add support for *Switch 2* games to the `Amiibo` model type of the library. In addition, some test cases and documentation have been updated/revised due to this update.

Reviewed-on: #21
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2025-11-09 20:19:13 +00:00
javier 0d9c9e22a4 Open API and documentation improvements (#20)
This PR contains the work done to polish the `Open API` specification document as well as the `DocC` documentation even further, by removing unnecessary intermediate types and adding missing documentation.

Reviewed-on: #20
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2025-10-28 15:41:02 +00:00
javier 4623c13c24 Improved the Open API specification document (#19)
This PR contains the work done to improve the `OpenAPI` specification documentation that describes the `Amiibo API` online service as well as updates to the `AmiiboLiveClient` that uses the code generated out of the mentioned document. In addition, some test cases have been updated to reflect the latest data in the service.

Reviewed-on: #19
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Co-committed-by: Javier Cicchelli <javier@rock-n-code.com>
2025-10-14 23:26:42 +00:00
329 changed files with 2965 additions and 1783 deletions

No files matched your search

+1 -1
View File
@@ -2,7 +2,7 @@
## ##
## This source file is part of the Amiibo Service open source project ## This source file is part of the Amiibo Service open source project
## ##
## Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors ## Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
## Licensed under Apache license v2.0 ## Licensed under Apache license v2.0
## ##
## See LICENSE for license information ## See LICENSE for license information
+57
View File
@@ -0,0 +1,57 @@
# ===----------------------------------------------------------------------===
#
# This source file is part of the Amiibo Service open source project
#
# Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
# Licensed under Apache license v2.0
#
# See LICENSE for license information
# See CONTRIBUTORS for the list of Amiibo Service project authors
#
# SPDX-License-Identifier: Apache-2.0
#
# ===----------------------------------------------------------------------===
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: read
concurrency:
group: ci-${{ github.ref }}
cancel-in-progress: true
jobs:
test:
name: Build and test
runs-on: macos-latest
steps:
- name: Check out
uses: actions/checkout@v4
- name: Select Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Show toolchain
run: swift --version
- name: Cache build
uses: actions/cache@v4
with:
path: .build
key: spm-${{ runner.os }}-${{ hashFiles('Package.resolved') }}
restore-keys: spm-${{ runner.os }}-
- name: Build
run: make lib-build
- name: Test
run: make lib-test
+77
View File
@@ -0,0 +1,77 @@
# ===----------------------------------------------------------------------===
#
# This source file is part of the Amiibo Service open source project
#
# Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
# Licensed under Apache license v2.0
#
# See LICENSE for license information
# See CONTRIBUTORS for the list of Amiibo Service project authors
#
# SPDX-License-Identifier: Apache-2.0
#
# ===----------------------------------------------------------------------===
name: Documentation
on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:
permissions:
contents: read
concurrency:
group: docs-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: Build documentation
runs-on: macos-latest
steps:
- name: Check out
uses: actions/checkout@v4
# Pinned: swift-docc-plugin 1.5.0 fails to launch its tools under Xcode 27 ("Bad CPU type in executable").
- name: Select Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '26'
- name: Show toolchain
run: swift --version
- name: Cache build
uses: actions/cache@v4
with:
path: .build
key: spm-${{ runner.os }}-${{ hashFiles('Package.resolved') }}
restore-keys: spm-${{ runner.os }}-
- name: Generate
run: make doc-generate-github
- name: Upload
uses: actions/upload-pages-artifact@v3
with:
path: docs
deploy:
name: Deploy to GitHub Pages
if: github.event_name != 'pull_request'
needs: build
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deploy.outputs.page_url }}
steps:
- name: Deploy
id: deploy
uses: actions/deploy-pages@v4
+52
View File
@@ -0,0 +1,52 @@
# ===----------------------------------------------------------------------===
#
# This source file is part of the Amiibo Service open source project
#
# Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
# Licensed under Apache license v2.0
#
# See LICENSE for license information
# See CONTRIBUTORS for the list of Amiibo Service project authors
#
# SPDX-License-Identifier: Apache-2.0
#
# ===----------------------------------------------------------------------===
name: Live tests
on:
schedule:
# Every Monday at 06:00 UTC.
- cron: '0 6 * * 1'
workflow_dispatch:
permissions:
contents: read
jobs:
test:
name: Test against the live service
runs-on: macos-latest
steps:
- name: Check out
uses: actions/checkout@v4
- name: Select Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: latest-stable
- name: Show toolchain
run: swift --version
- name: Cache build
uses: actions/cache@v4
with:
path: .build
key: spm-${{ runner.os }}-${{ hashFiles('Package.resolved') }}
restore-keys: spm-${{ runner.os }}-
- name: Test
run: make lib-test
env:
AMIIBO_LIVE_TESTS: '1'
+3 -2
View File
@@ -2,7 +2,7 @@
## ##
## This source file is part of the Amiibo Service open source project ## This source file is part of the Amiibo Service open source project
## ##
## Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors ## Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
## Licensed under Apache license v2.0 ## Licensed under Apache license v2.0
## ##
## See LICENSE for license information ## See LICENSE for license information
@@ -48,4 +48,5 @@ Packages/
.vscode .vscode
# DocC documentation # DocC documentation
*.doccarchive *.doccarchive
docs/
+1 -1
View File
@@ -2,7 +2,7 @@
## ##
## This source file is part of the Amiibo Service open source project ## This source file is part of the Amiibo Service open source project
## ##
## Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors ## Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
## Licensed under Apache license v2.0 ## Licensed under Apache license v2.0
## ##
## See LICENSE for license information ## See LICENSE for license information
+1 -1
View File
@@ -2,7 +2,7 @@
## ##
## This source file is part of the Amiibo Service open source project ## This source file is part of the Amiibo Service open source project
## ##
## Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors ## Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
## Licensed under Apache license v2.0 ## Licensed under Apache license v2.0
## ##
## See LICENSE for license information ## See LICENSE for license information
+2 -2
View File
@@ -5,7 +5,7 @@ Please visit the Amiibo Service web site for more information:
* https://github.com/rock-n-code/amiibo-service * https://github.com/rock-n-code/amiibo-service
Copyright 2025 Röck+Cöde VoF Copyright 2026 Röck+Cöde VoF
The Amiibo Service Project licenses this file to you under the Apache License, The Amiibo Service Project licenses this file to you under the Apache License,
version 2.0 (the "License"); you may not use this file except in compliance version 2.0 (the "License"); you may not use this file except in compliance
@@ -17,4 +17,4 @@ Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations License for the specific language governing permissions and limitations
under the License. under the License.
+7 -4
View File
@@ -1,10 +1,10 @@
// swift-tools-version: 5.10 // swift-tools-version: 6.2
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -32,9 +32,10 @@ let package = Package(
) )
], ],
dependencies: [ dependencies: [
.package(url: "https://github.com/apple/swift-openapi-generator.git", from: "1.3.0"), .package(url: "https://github.com/apple/swift-openapi-generator.git", from: "1.11.0"),
.package(url: "https://github.com/apple/swift-openapi-runtime", from: "1.5.0"), .package(url: "https://github.com/apple/swift-openapi-runtime", from: "1.5.0"),
.package(url: "https://github.com/apple/swift-openapi-urlsession", from: "1.0.2"), .package(url: "https://github.com/apple/swift-openapi-urlsession", from: "1.0.2"),
.package(url: "https://github.com/apple/swift-http-types", from: "1.0.0"),
.package(url: "https://github.com/swiftlang/swift-docc-plugin", from: "1.1.0"), .package(url: "https://github.com/swiftlang/swift-docc-plugin", from: "1.1.0"),
], ],
targets: [ targets: [
@@ -52,7 +53,9 @@ let package = Package(
.testTarget( .testTarget(
name: AmiiboService.test, name: AmiiboService.test,
dependencies: [ dependencies: [
.byName(name: AmiiboService.target) .byName(name: AmiiboService.target),
.product(name: "HTTPTypes", package: "swift-http-types"),
.product(name: "OpenAPIRuntime", package: "swift-openapi-runtime")
], ],
path: "Tests/AmiiboService" path: "Tests/AmiiboService"
), ),
+121 -10
View File
@@ -1,37 +1,148 @@
[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Frock-n-code%2Famiibo-service%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/rock-n-code/amiibo-service) [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Frock-n-code%2Famiibo-service%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/rock-n-code/amiibo-service)
[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Frock-n-code%2Famiibo-service%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/rock-n-code/amiibo-service) [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Frock-n-code%2Famiibo-service%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/rock-n-code/amiibo-service)
[![](https://github.com/rock-n-code/amiibo-service/actions/workflows/ci.yml/badge.svg)](https://github.com/rock-n-code/amiibo-service/actions/workflows/ci.yml)
# Amiibo Service # Amiibo Service
A library written entirely with [Swift](https://www.swift.org) that provides everything the developer needs to interacts with the [Amiibo API](https://www.amiiboapi.com) backend service. A Swift client for the [Amiibo API](https://www.amiiboapi.org).
## Requirements
- Swift 6.2 or later
- iOS 13, macOS 10.15, tvOS 13, visionOS 1, or watchOS 6 or later
## Installation ## Installation
To use this library, then it is mandatory to add it as a dependency in the `Package.swift` file: Add the package and the `AmiiboService` product to `Package.swift`:
```swift ```swift
let package = Package( let package = Package(
// name, platforms, products, etc. // name, platforms, products, etc.
dependencies: [ dependencies: [
.package(url: "https://github.com/rock-n-code/amiibo-service", from: "1.1.0"), .package(url: "https://github.com/rock-n-code/amiibo-service", from: "2.0.0"),
// other dependencies
], ],
targets: [ targets: [
.target( .target(
name: "SomeTarget", name: "SomeTarget",
dependencies: [ dependencies: [
.product(name: "AmiiboService", package: "amiibo-service"), .product(name: "AmiiboService", package: "amiibo-service"),
] ]
) ),
// other targets
] ]
) )
``` ```
It is also possible to use this library with your app in Xcode, then add it as a dependency in your Xcode project. In Xcode, add the package URL under **File › Add Package Dependencies…**.
> important: Swift 5.10 or higher is required in order to build this library. ## Usage
```swift
import AmiiboService
let service = AmiiboService()
// All amiibos
let amiibos = try await service.getAmiibos()
// Amiibos whose name contains "zelda"
let zeldaAmiibos = try await service.getAmiibos(.init(name: "zelda"))
// Amiibo series, types, game characters, and game series
let series = try await service.getAmiiboSeries()
let types = try await service.getAmiiboTypes()
let characters = try await service.getGameCharacters()
let gameSeries = try await service.getGameSeries()
// Date of the last data update (UTC)
let lastUpdated = try await service.getLastUpdated()
```
Results are sorted in ascending order by identifier (amiibos) or key (everything else). Models are `Hashable`, `Codable`, and `Identifiable`; filters are `Hashable`.
## Error handling
Every call throws `AmiiboServiceError`. When nothing matches, `getAmiibos(_:)` returns an empty array, while the other list calls throw `AmiiboServiceError.notFound`:
```swift
do throws(AmiiboServiceError) {
let series = try await service.getAmiiboSeries(.init(key: "0x01"))
} catch .notFound {
// No amiibo series has this key.
} catch {
// .badRequest, .cancelled, .decoding, .notAvailable, .undocumented, or .unknown
}
```
## Caching
The library has no built-in cache. The Amiibo API asks regular consumers to cache responses. To do that, give `AmiiboLiveClient` a transport backed by a `URLCache`:
```swift
import OpenAPIURLSession
let configuration = URLSessionConfiguration.default
configuration.urlCache = URLCache(
memoryCapacity: 5_000_000,
diskCapacity: 50_000_000
)
let transport = URLSessionTransport(
configuration: .init(
session: URLSession(configuration: configuration)
)
)
let service = AmiiboService(
client: AmiiboLiveClient(transport: transport)
)
```
## Testing
To test without network access, pass a mock `AmiiboClient` to `AmiiboService(client:)`. `AmiiboClient` refines `Sendable`, so the mock must be `Sendable`, too:
```swift
import AmiiboService
struct MockClient: AmiiboClient {
var error: AmiiboServiceError?
func getAmiibos(
by filter: AmiiboFilter
) async throws(AmiiboServiceError) -> [Amiibo] {
if let error { throw error }
return []
}
// Implement the remaining requirements...
}
let service = AmiiboService(client: MockClient())
```
## Development
Run `make` to list the available tasks for building, testing, and generating documentation.
The test suite runs offline by default. Tests against the live service run only if `AMIIBO_LIVE_TESTS` is set to `1`:
```shell
AMIIBO_LIVE_TESTS=1 swift test
```
In Xcode, set the variable in the scheme's **Test** action.
The live tests compare the responses against baselines recorded from the service: minimum item counts per endpoint and the earliest accepted last-updated date. These live in the `Int` extension at the bottom of `AmiiboServiceLiveTests.swift` and in the `get the last updated timestamp` test. Refresh them occasionally by fetching the current totals and the current timestamp from the service, then updating the constants and their `as of` notes:
```shell
for endpoint in amiibo amiiboseries type character gameseries; do
printf '%s: ' "$endpoint"
curl -s "https://www.amiiboapi.org/api/$endpoint/" | python3 -c 'import json,sys; print(len(json.load(sys.stdin)["amiibo"]))'
done
curl -s https://www.amiiboapi.org/api/lastupdated/
```
## Documentation ## Documentation
Please refer to the [online documentation](https://rock-n-code.github.io/amiibo-service/documentation/amiiboservice/) for further informations about this library. See the [online documentation](https://rock-n-code.github.io/amiibo-service/documentation/amiiboservice/).
@@ -0,0 +1,10 @@
# ``Amiibo``
## Topics
### Nested Models
- ``Amiibo/Game``
- ``Amiibo/Platform``
- ``Amiibo/Release``
- ``Amiibo/Usage``
@@ -0,0 +1,18 @@
# ``AmiiboClient``
## Topics
### Amiibo endpoints
- ``AmiiboClient/getAmiibos(by:)``
- ``AmiiboClient/getAmiiboSeries(by:)``
- ``AmiiboClient/getAmiiboTypes(by:)``
### Game endpoints
- ``AmiiboClient/getGameCharacters(by:)``
- ``AmiiboClient/getGameSeries(by:)``
### System endpoints
- ``AmiiboClient/getLastUpdated()``
@@ -0,0 +1,22 @@
# ``AmiiboLiveClient``
## Topics
### Initializers
- ``AmiiboLiveClient/init(transport:)``
### Amiibo endpoints
- ``AmiiboLiveClient/getAmiibos(by:)``
- ``AmiiboLiveClient/getAmiiboSeries(by:)``
- ``AmiiboLiveClient/getAmiiboTypes(by:)``
### Game endpoints
- ``AmiiboLiveClient/getGameCharacters(by:)``
- ``AmiiboLiveClient/getGameSeries(by:)``
### System endpoints
- ``AmiiboLiveClient/getLastUpdated()``
@@ -0,0 +1,22 @@
# ``AmiiboService/AmiiboService``
## Topics
### Initializers
- ``AmiiboService/AmiiboService/init(client:)``
### Amiibo endpoints
- ``AmiiboService/AmiiboService/getAmiibos(_:)``
- ``AmiiboService/AmiiboService/getAmiiboSeries(_:)``
- ``AmiiboService/AmiiboService/getAmiiboTypes(_:)``
### Game endpoints
- ``AmiiboService/AmiiboService/getGameCharacters(_:)``
- ``AmiiboService/AmiiboService/getGameSeries(_:)``
### System endpoints
- ``AmiiboService/AmiiboService/getLastUpdated()``
@@ -0,0 +1,19 @@
# ``AmiiboServiceError``
## Topics
### Request errors
- ``AmiiboServiceError/badRequest``
- ``AmiiboServiceError/cancelled``
### Response errors
- ``AmiiboServiceError/decoding``
- ``AmiiboServiceError/notFound``
### Service errors
- ``AmiiboServiceError/notAvailable``
- ``AmiiboServiceError/undocumented(_:)``
- ``AmiiboServiceError/unknown(_:)``
@@ -1,50 +1,127 @@
# ``AmiiboService`` # ``AmiiboService``
A library that provides everything the developer needs to interact with the **Amiibo API** backend service. A Swift client for the Amiibo API.
## Overview ## Overview
The `amiibo-service` library is a package that allows the developer to interact with the [Amiibo API](https://www.amiiboapi.com) backend service seamlessly, by not only providing the *service* type but also any possible *models*, *filters*, *errors* and *interfaces* types that might be needed during implementation. `AmiiboService` fetches data from the [Amiibo API](https://www.amiiboapi.org) and returns it as Swift models.
## Design ``AmiiboService`` offers one method per resource: each takes a typed filter, returns sorted models, and throws ``AmiiboServiceError``.
Although it could have been possible to generate a one-to-one RESTful client based on the Open API specification document that describe the available endpoints of the backend service, it was decided to design a `AmiiboService` service type that removes the complexities of the API design imposed by the backend service, and provides the developer with a simple interface, and a seamless experience.
## Installation ## Installation
To use the `AmiiboService` library with your package, then add it as a dependency in the `Package.swift` file: Add the package and the `AmiiboService` product to `Package.swift`:
```swift ```swift
let package = Package( let package = Package(
// name, platforms, products, etc. // name, platforms, products, etc.
dependencies: [ dependencies: [
.package(url: "https://github.com/rock-n-code/amiibo-service", from: "1.1.0"), .package(url: "https://github.com/rock-n-code/amiibo-service", from: "2.0.0"),
// other dependencies
], ],
targets: [ targets: [
.target( .target(
name: "SomeTarget", name: "SomeTarget",
dependencies: [ dependencies: [
.product(name: "AmiiboService", package: "amiibo-service"), .product(name: "AmiiboService", package: "amiibo-service"),
] ]
) ),
// other targets
] ]
) )
``` ```
It is also possible to use the `AmiiboService` library with your app in Xcode, then add it as a dependency in your Xcode project. In Xcode, add the package URL under **File › Add Package Dependencies…**.
> important: Swift 5.10 or higher is required in order to compile this library. > Important: Requires Swift 6.2 or later, and iOS 13, macOS 10.15, tvOS 13, visionOS 1, or watchOS 6 or later.
## Tasks ## Usage
This library offers a set of ready-to-use tasks that simplify the interaction with the library, which the developer can use from any `Terminal` application. Create an ``AmiiboService`` and call its methods. When you omit the filter, the method returns every item:
> Tip: To show the available list of tasks, plus display some explanations about each and every one of them; please enter the following command: ```swift
import AmiiboService
```bash let service = AmiiboService()
$ make
// All amiibos
let amiibos = try await service.getAmiibos()
// Amiibos whose name contains "zelda"
let zeldaAmiibos = try await service.getAmiibos(.init(name: "zelda"))
// Amiibo series, types, game characters, and game series
let series = try await service.getAmiiboSeries()
let types = try await service.getAmiiboTypes()
let characters = try await service.getGameCharacters()
let gameSeries = try await service.getGameSeries()
// Date of the last data update (UTC)
let lastUpdated = try await service.getLastUpdated()
```
Results are sorted in ascending order by ``Amiibo/identifier`` or by `key`.
## Error handling
Every method throws ``AmiiboServiceError``. When nothing matches, ``AmiiboService/getAmiibos(_:)`` returns an empty array, while the other list methods throw ``AmiiboServiceError/notFound``:
```swift
do throws(AmiiboServiceError) {
let series = try await service.getAmiiboSeries(.init(key: "0x01"))
} catch .notFound {
// No amiibo series has this key.
} catch {
// .badRequest, .cancelled, .decoding, .notAvailable, .undocumented, or .unknown
}
```
## Caching
The library has no built-in cache, and the Amiibo API asks regular consumers to cache responses. To cache at the HTTP level, give ``AmiiboLiveClient`` a transport backed by a `URLCache`:
```swift
import OpenAPIURLSession
let configuration = URLSessionConfiguration.default
configuration.urlCache = URLCache(
memoryCapacity: 5_000_000,
diskCapacity: 50_000_000
)
let transport = URLSessionTransport(
configuration: .init(
session: URLSession(configuration: configuration)
)
)
let service = AmiiboService(
client: AmiiboLiveClient(transport: transport)
)
```
Models are `Codable`, so you can also store them yourself.
## Testing
To test without network access, pass a mock ``AmiiboClient`` to ``AmiiboService/init(client:)``. ``AmiiboClient`` refines `Sendable`, so the mock must be `Sendable`, too:
```swift
import AmiiboService
struct MockClient: AmiiboClient {
var error: AmiiboServiceError?
func getAmiibos(
by filter: AmiiboFilter
) async throws(AmiiboServiceError) -> [Amiibo] {
if let error { throw error }
return []
}
// Implement the remaining requirements...
}
let service = AmiiboService(client: MockClient())
``` ```
## Topics ## Topics
@@ -58,13 +135,9 @@ $ make
- ``AmiiboClient`` - ``AmiiboClient``
- ``AmiiboLiveClient`` - ``AmiiboLiveClient``
### Types ### Models
- ``Amiibo`` - ``Amiibo``
- ``Amiibo/Game``
- ``Amiibo/Platform``
- ``Amiibo/Release``
- ``Amiibo/Usage``
- ``AmiiboSeries`` - ``AmiiboSeries``
- ``AmiiboType`` - ``AmiiboType``
- ``GameCharacter`` - ``GameCharacter``
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -18,17 +18,30 @@ extension DateFormatter {
// MARK: Properties // MARK: Properties
/// An ISO timestamp formatter. /// An ISO date formatter for the `yyyy-MM-dd` format.
/// static let isoDate: DateFormatter = {
/// This formatter implements the `yyyy-MM-dd'T'HH:mm:ss.SSSSSS` custom date format.
/// Within the context of this library, this formatter is solely used to decode a date formatted as a timestamp that is returned by the ``AmiiboService/getLastUpdated()`` function.
static var isoTimestamp: DateFormatter {
let formatter = DateFormatter() let formatter = DateFormatter()
// The POSIX locale keeps the user's locale and 12/24-hour setting from altering fixed-format parsing.
formatter.locale = .init(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd"
formatter.timeZone = .init(secondsFromGMT: 0)
return formatter
}()
/// An ISO timestamp formatter for the `yyyy-MM-dd'T'HH:mm:ss.SSSSSS` format.
///
/// Used only to decode the timestamp returned by ``AmiiboService/getLastUpdated()``.
static let isoTimestamp: DateFormatter = {
let formatter = DateFormatter()
// The POSIX locale keeps the user's locale and 12/24-hour setting from altering fixed-format parsing.
formatter.locale = .init(identifier: "en_US_POSIX")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS" formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"
formatter.timeZone = .init(secondsFromGMT: 0) formatter.timeZone = .init(secondsFromGMT: 0)
return formatter return formatter
} }()
} }
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -12,8 +12,8 @@
// //
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
/// A protocol that defines filters that might contain `key` and/or `name` values. /// A protocol for filters with optional `key` and `name` values.
protocol KeyNameFilter { protocol KeyNameFilter: Hashable {
// MARK: Properties // MARK: Properties
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -12,21 +12,21 @@
// //
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
/// 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 { protocol KeyNameModel: Sendable, Hashable, Codable, Identifiable {
// 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
/// Initializes this model from a given payload. /// Initializes this model from a given payload.
/// - Parameter payload: A payload that contains the values for the model. /// - Parameter payload: A payload that contains the values for the model.
init(_ payload: Components.Schemas.Tuple) init(_ payload: some KeyNamePayload)
} }
@@ -0,0 +1,33 @@
// ===----------------------------------------------------------------------===
//
// This source file is part of the Amiibo Service open source project
//
// Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0
//
// See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors
//
// SPDX-License-Identifier: Apache-2.0
//
// ===----------------------------------------------------------------------===
/// A protocol that unifies the generated payload types containing a `key` and `name` pair.
protocol KeyNamePayload {
// MARK: Properties
/// A hexadecimal key that uniquely identifies this payload.
var key: String { get }
/// A display name for this payload.
var name: String { get }
}
// MARK: - Conformances
extension Components.Schemas.AmiiboSeries: KeyNamePayload {}
extension Components.Schemas.AmiiboType: KeyNamePayload {}
extension Components.Schemas.GameCharacter: KeyNamePayload {}
extension Components.Schemas.GameSeries: KeyNamePayload {}
@@ -0,0 +1,59 @@
// ===----------------------------------------------------------------------===
//
// This source file is part of the Amiibo Service open source project
//
// Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0
//
// See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors
//
// SPDX-License-Identifier: Apache-2.0
//
// ===----------------------------------------------------------------------===
import Foundation
import OpenAPIRuntime
/// A transcoder for ISO dates in the `yyyy-MM-dd'T'HH:mm:ss.SSSSSS` timestamp and `yyyy-MM-dd` date-only formats.
struct ISODateTimeTranscoder {
// MARK: Properties
/// The ISO timestamp formatter.
private let timestampFormatter: DateFormatter = .isoTimestamp
/// The ISO date-only formatter.
private let dateFormatter: DateFormatter = .isoDate
}
// MARK: - DateTranscoder
extension ISODateTimeTranscoder: DateTranscoder {
// MARK: Functions
/// Encodes a date as an ISO timestamp string.
func encode(_ date: Date) throws -> String {
timestampFormatter.string(from: date)
}
/// Decodes an ISO date string, trying the timestamp format before the date-only one.
/// - Throws: A `DecodingError` if the string matches neither format.
func decode(_ string: String) throws -> Date {
if let date = timestampFormatter.date(from: string) {
return date
}
if let date = dateFormatter.date(from: string) {
return date
}
throw DecodingError.dataCorrupted(.init(
codingPath: [],
debugDescription: "Expected an ISO date with format 'yyyy-MM-dd'T'HH:mm:ss.SSSSSS' or 'yyyy-MM-dd', but found '\(string)' instead."
))
}
}
@@ -1,42 +0,0 @@
// ===----------------------------------------------------------------------===
//
// This source file is part of the Amiibo Service open source project
//
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0
//
// See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors
//
// SPDX-License-Identifier: Apache-2.0
//
// ===----------------------------------------------------------------------===
import Foundation
import OpenAPIRuntime
/// A type that allows the decoding and encoding of ISO timestamp dates, defined by the `yyyy-MM-dd'T'HH:mm:ss.SSSSSS` custom date format.
struct ISOTimestampTranscoder {
// MARK: Properties
/// A formatter to use to decode and encode ISO timestamps dates.
private let dateFormatter: DateFormatter = .isoTimestamp
}
// MARK: - DateTranscoder
extension ISOTimestampTranscoder: DateTranscoder {
// MARK: Functions
func encode(_ date: Date) throws -> String {
dateFormatter.string(from: date)
}
func decode(_ string: String) throws -> Date {
dateFormatter.date(from: string) ?? .init()
}
}
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -16,23 +16,37 @@ import Foundation
import OpenAPIRuntime import OpenAPIRuntime
import OpenAPIURLSession import OpenAPIURLSession
/// A type that implements a live client to the online service. /// A live client for the [Amiibo API](https://www.amiiboapi.org).
///
/// It maps transport errors and unsuccessful responses to ``AmiiboServiceError``, and sorts list results by identifier or key.
public struct AmiiboLiveClient: Sendable { public struct AmiiboLiveClient: Sendable {
// MARK: Constants
/// The base URL of the live service, from the OpenAPI specification.
///
/// A unit test guards this URL, so resolution is not expected to fail at runtime.
static let serverURL: URL = {
guard let url = try? Servers.Server1.url() else {
fatalError("The server URL defined in the OpenAPI specification could not be resolved. Verify that the 'openapi.yaml' server definition is valid.")
}
return url
}()
// 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.
/// - Parameter transport: A transport that performs HTTP operations. /// - Parameter transport: A transport for HTTP operations. Defaults to a `URLSessionTransport` on 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. serverURL: Self.serverURL,
serverURL: try! Servers.Server1.url(), configuration: .init(dateTranscoder: ISODateTimeTranscoder()),
configuration: .init(dateTranscoder: ISOTimestampTranscoder()),
transport: transport transport: transport
) )
} }
@@ -40,17 +54,17 @@ public struct AmiiboLiveClient: Sendable {
} }
// MARK: - AmiiboClient // MARK: - AmiiboClient
// TODO: Remove the documentation from the functions inside the following extension as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?). // NOTE: The `AmiiboClient` documentation is repeated below on purpose, as the compiler does not inherit
// documentation for protocol witnesses and DocC would otherwise render these functions undocumented.
extension AmiiboLiveClient: AmiiboClient { extension AmiiboLiveClient: AmiiboClient {
// MARK: Functions // MARK: Functions
#if swift(>=6.0)
/// Gets a list of amiibo items based on a given filter. /// Gets a list of amiibo items based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered amiibo items. /// - Returns: A list of filtered amiibo items.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
public func getAmiibos( public func getAmiibos(
by filter: AmiiboFilter by filter: AmiiboFilter
) async throws(AmiiboServiceError) -> [Amiibo] { ) async throws(AmiiboServiceError) -> [Amiibo] {
@@ -58,9 +72,9 @@ extension AmiiboLiveClient: AmiiboClient {
} }
/// Gets a list of amiibo series based on a given filter. /// Gets a list of amiibo series based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered amiibo series. /// - Returns: A list of filtered amiibo series.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
public func getAmiiboSeries( public func getAmiiboSeries(
by filter: AmiiboSeriesFilter by filter: AmiiboSeriesFilter
) async throws(AmiiboServiceError) -> [AmiiboSeries] { ) async throws(AmiiboServiceError) -> [AmiiboSeries] {
@@ -68,9 +82,9 @@ extension AmiiboLiveClient: AmiiboClient {
} }
/// Gets a list of amiibo types based on a given filter. /// Gets a list of amiibo types based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered amiibo types. /// - Returns: A list of filtered amiibo types.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
public func getAmiiboTypes( public func getAmiiboTypes(
by filter: AmiiboTypeFilter by filter: AmiiboTypeFilter
) async throws(AmiiboServiceError) -> [AmiiboType] { ) async throws(AmiiboServiceError) -> [AmiiboType] {
@@ -78,9 +92,9 @@ extension AmiiboLiveClient: AmiiboClient {
} }
/// Gets a list of game characters based on a given filter. /// Gets a list of game characters based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered game characters. /// - Returns: A list of filtered game characters.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
public func getGameCharacters( public func getGameCharacters(
by filter: GameCharacterFilter by filter: GameCharacterFilter
) async throws(AmiiboServiceError) -> [GameCharacter] { ) async throws(AmiiboServiceError) -> [GameCharacter] {
@@ -88,9 +102,9 @@ extension AmiiboLiveClient: AmiiboClient {
} }
/// Gets a list of game series based on a given filter. /// Gets a list of game series based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered game series. /// - Returns: A list of filtered game series.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
public func getGameSeries( public func getGameSeries(
by filter: GameSeriesFilter by filter: GameSeriesFilter
) async throws(AmiiboServiceError) -> [GameSeries] { ) async throws(AmiiboServiceError) -> [GameSeries] {
@@ -98,69 +112,11 @@ extension AmiiboLiveClient: AmiiboClient {
} }
/// Gets the date when the data was last updated. /// Gets the date when the data was last updated.
/// - Returns: A last updated date. /// - Returns: A last updated date, decoded as UTC.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
public func getLastUpdated() async throws(AmiiboServiceError) -> Date { public func getLastUpdated() async throws(AmiiboServiceError) -> Date {
try await fetchLastUpdated() try await fetchLastUpdated()
} }
#else
/// Gets a list of amiibo items based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered amiibo items.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
public func getAmiibos(
by filter: AmiiboFilter
) async throws -> [Amiibo] {
try await fetchAmiibos(filter)
}
/// Gets a list of amiibo series based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered amiibo series.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
public func getAmiiboSeries(
by filter: AmiiboSeriesFilter
) async throws -> [AmiiboSeries] {
try await fetchAmiiboSeries(filter)
}
/// Gets a list of amiibo types based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered amiibo types.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
public func getAmiiboTypes(
by filter: AmiiboTypeFilter
) async throws -> [AmiiboType] {
try await fetchAmiiboTypes(filter)
}
/// Gets a list of game characters based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered game characters.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
public func getGameCharacters(
by filter: GameCharacterFilter
) async throws -> [GameCharacter] {
try await fetchGameCharacters(filter)
}
/// Gets a list of game series based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered game series.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
public func getGameSeries(
by filter: GameSeriesFilter
) async throws -> [GameSeries] {
try await fetchGameSeries(filter)
}
/// Gets the date when the data was last updated.
/// - Returns: A last updated date.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
public func getLastUpdated() async throws -> Date {
try await fetchLastUpdated()
}
#endif
} }
@@ -170,37 +126,40 @@ private extension AmiiboLiveClient {
// MARK: Functions // MARK: Functions
/// Fetches a list of amiibo items based on a given filter. /// Fetches the amiibos matching a filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of fetched amiibo items filtered, if requested.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
func fetchAmiibos( func fetchAmiibos(
_ filter: AmiiboFilter _ filter: AmiiboFilter
) async throws -> [Amiibo] { ) async throws(AmiiboServiceError) -> [Amiibo] {
let response: Operations.getAmiibos.Output let response = try await perform {
try await client.getAmiibos(.init(query: .init(
do { id: filter.identifier,
response = try await client.getAmiibos(.init(query: .init( head: filter.head,
tail: filter.tail,
name: filter.name,
_type: filter.type,
amiiboSeries: filter.series, amiiboSeries: filter.series,
character: filter.gameCharacter, character: filter.gameCharacter,
gameseries: filter.gameSeries, gameseries: filter.gameSeries,
head: filter.head,
id: filter.identifier,
name: filter.name,
showgames: filter.showGames, showgames: filter.showGames,
showusage: filter.showUsage, showusage: filter.showUsage
tail: filter.tail,
_type: filter.type
))) )))
} catch {
try handle(error: error)
} }
switch response { switch response {
case let .ok(ok): case let .ok(ok):
switch ok.body { switch ok.body {
case let .json(output): case let .json(output):
return map(output) switch output.amiibo {
case let .Amiibo(object):
return [Amiibo(object)]
case let .AmiiboList(list):
return list
.map { Amiibo($0) }
.sorted { $0.identifier < $1.identifier }
case .none:
// The service returns `"amiibo": null` when an `id` filter matches nothing.
return []
}
} }
case .badRequest: case .badRequest:
throw AmiiboServiceError.badRequest throw AmiiboServiceError.badRequest
@@ -213,29 +172,27 @@ private extension AmiiboLiveClient {
} }
} }
/// Fetches a list of amiibo series based on a given filter. /// Fetches the amiibo series matching a filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of fetched amiibo series filtered, if requested.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
func fetchAmiiboSeries( func fetchAmiiboSeries(
_ filter: AmiiboSeriesFilter _ filter: AmiiboSeriesFilter
) async throws -> [AmiiboSeries] { ) async throws(AmiiboServiceError) -> [AmiiboSeries] {
let response: Operations.getAmiiboSeries.Output let response = try await perform {
try await client.getAmiiboSeries(.init(query: .init(
do {
response = try await client.getAmiiboSeries(.init(query: .init(
key: filter.key, key: filter.key,
name: filter.name name: filter.name
))) )))
} catch {
try handle(error: error)
} }
switch response { switch response {
case let .ok(ok): case let .ok(ok):
switch ok.body { switch ok.body {
case let .json(output): case let .json(output):
return map(output) switch output.amiibo {
case let .AmiiboSeries(payload):
return makeModels(from: [payload])
case let .AmiiboSeriesList(list):
return makeModels(from: list)
}
} }
case .badRequest: case .badRequest:
throw AmiiboServiceError.badRequest throw AmiiboServiceError.badRequest
@@ -248,29 +205,27 @@ private extension AmiiboLiveClient {
} }
} }
/// Fetches a list of amiibo types based on a given filter. /// Fetches the amiibo types matching a filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of fetched amiibo types filtered, if requested.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
func fetchAmiiboTypes( func fetchAmiiboTypes(
_ filter: AmiiboTypeFilter _ filter: AmiiboTypeFilter
) async throws -> [AmiiboType] { ) async throws(AmiiboServiceError) -> [AmiiboType] {
let response: Operations.getAmiiboTypes.Output let response = try await perform {
try await client.getAmiiboTypes(.init(query: .init(
do {
response = try await client.getAmiiboTypes(.init(query: .init(
key: filter.key, key: filter.key,
name: filter.name name: filter.name
))) )))
} catch {
try handle(error: error)
} }
switch response { switch response {
case let .ok(ok): case let .ok(ok):
switch ok.body { switch ok.body {
case let .json(output): case let .json(output):
return map(output) switch output.amiibo {
case let .AmiiboType(payload):
return makeModels(from: [payload])
case let .AmiiboTypeList(list):
return makeModels(from: list)
}
} }
case .badRequest: case .badRequest:
throw AmiiboServiceError.badRequest throw AmiiboServiceError.badRequest
@@ -283,29 +238,27 @@ private extension AmiiboLiveClient {
} }
} }
/// Fetches a list of game characters based on a given filter. /// Fetches the game characters matching a filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of fetched game characters filtered, if requested.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
func fetchGameCharacters( func fetchGameCharacters(
_ filter: GameCharacterFilter _ filter: GameCharacterFilter
) async throws -> [GameCharacter] { ) async throws(AmiiboServiceError) -> [GameCharacter] {
let response: Operations.getGameCharacters.Output let response = try await perform {
try await client.getGameCharacters(.init(query: .init(
do {
response = try await client.getGameCharacters(.init(query: .init(
key: filter.key, key: filter.key,
name: filter.name name: filter.name
))) )))
} catch {
try handle(error: error)
} }
switch response { switch response {
case let .ok(ok): case let .ok(ok):
switch ok.body { switch ok.body {
case let .json(output): case let .json(output):
return map(output) switch output.amiibo {
case let .GameCharacter(payload):
return makeModels(from: [payload])
case let .GameCharacterList(list):
return makeModels(from: list)
}
} }
case .badRequest: case .badRequest:
throw AmiiboServiceError.badRequest throw AmiiboServiceError.badRequest
@@ -318,29 +271,27 @@ private extension AmiiboLiveClient {
} }
} }
/// Fetches a list of game series based on a given filter. /// Fetches the game series matching a filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of fetched game series filtered, if requested.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
func fetchGameSeries( func fetchGameSeries(
_ filter: GameSeriesFilter _ filter: GameSeriesFilter
) async throws -> [GameSeries] { ) async throws(AmiiboServiceError) -> [GameSeries] {
let response: Operations.getGameSeries.Output let response = try await perform {
try await client.getGameSeries(.init(query: .init(
do {
response = try await client.getGameSeries(.init(query: .init(
key: filter.key, key: filter.key,
name: filter.name name: filter.name
))) )))
} catch {
try handle(error: error)
} }
switch response { switch response {
case let .ok(ok): case let .ok(ok):
switch ok.body { switch ok.body {
case let .json(output): case let .json(output):
return map(output) switch output.amiibo {
case let .GameSeries(payload):
return makeModels(from: [payload])
case let .GameSeriesList(list):
return makeModels(from: list)
}
} }
case .badRequest: case .badRequest:
throw AmiiboServiceError.badRequest throw AmiiboServiceError.badRequest
@@ -354,15 +305,9 @@ private extension AmiiboLiveClient {
} }
/// Fetches the date when the data was last updated. /// Fetches the date when the data was last updated.
/// - Returns: A fetched last updated date. func fetchLastUpdated() async throws(AmiiboServiceError) -> Date {
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. let response = try await perform {
func fetchLastUpdated() async throws -> Date { try await client.getLastUpdated()
let response: Operations.getLastUpdated.Output
do {
response = try await client.getLastUpdated()
} catch {
try handle(error: error)
} }
switch response { switch response {
@@ -371,10 +316,6 @@ private extension AmiiboLiveClient {
case let .json(output): case let .json(output):
return output.lastUpdated return output.lastUpdated
} }
case .badRequest:
throw AmiiboServiceError.badRequest
case .notFound:
throw AmiiboServiceError.notFound
case .internalServerError: case .internalServerError:
throw AmiiboServiceError.notAvailable throw AmiiboServiceError.notAvailable
case let .undocumented(statusCode, _): case let .undocumented(statusCode, _):
@@ -382,66 +323,60 @@ private extension AmiiboLiveClient {
} }
} }
/// Maps a given error to a `AmiiboServiceError` error. /// Performs an API call, mapping any error to an ``AmiiboServiceError``.
/// - Parameter error: An error to map. func perform<Output>(
/// - Throws: An ``AmiiboServiceError`` error. _ operation: () async throws -> Output
func handle(error: any Error) throws -> Never { ) async throws(AmiiboServiceError) -> Output {
do {
return try await operation()
} catch {
try handle(error: error)
}
}
/// Maps key-name payloads into models sorted by key.
func makeModels<Model: KeyNameModel>(from payloads: [some KeyNamePayload]) -> [Model] {
payloads
.map { Model($0) }
.sorted { $0.key < $1.key }
}
/// Maps an error to the corresponding ``AmiiboServiceError``.
func handle(error: any Error) throws(AmiiboServiceError) -> Never {
switch error { switch error {
case is CancellationError: case is CancellationError:
throw AmiiboServiceError.cancelled throw AmiiboServiceError.cancelled
case let clientError as ClientError: case let clientError as ClientError:
// The underlying client wraps every error, including cancellation, in a `ClientError`.
switch clientError.underlyingError { switch clientError.underlyingError {
case is CancellationError:
throw AmiiboServiceError.cancelled
case is DecodingError: case is DecodingError:
throw AmiiboServiceError.decoding throw AmiiboServiceError.decoding
case let urlError as URLError: case let urlError as URLError:
switch urlError.code { switch urlError.code {
case .cancelled:
throw AmiiboServiceError.cancelled
case .cannotParseResponse:
throw AmiiboServiceError.decoding
case .cannotFindHost, case .cannotFindHost,
.cannotConnectToHost, .cannotConnectToHost,
.dataNotAllowed,
.dnsLookupFailed, .dnsLookupFailed,
.internationalRoamingOff,
.networkConnectionLost, .networkConnectionLost,
.notConnectedToInternet, .notConnectedToInternet,
.secureConnectionFailed,
.timedOut: .timedOut:
throw AmiiboServiceError.notAvailable throw AmiiboServiceError.notAvailable
default: default:
throw AmiiboServiceError.unknown throw AmiiboServiceError.unknown(String(describing: urlError))
} }
default: default:
throw AmiiboServiceError.unknown throw AmiiboServiceError.unknown(String(describing: clientError.underlyingError))
} }
default: default:
throw AmiiboServiceError.unknown throw AmiiboServiceError.unknown(String(describing: error))
}
}
/// Retrieves a list of amiibo items from a wrapper container.
/// - Parameter wrapper: A wrapper container that either has an object or a list of items.
/// - Returns: A list of amiibo items, sorted by identifiers.
func map(
_ wrapper: Components.Schemas.AmiiboWrapper
) -> [Amiibo] {
switch wrapper.amiibo {
case let .Amiibo(object):
return [Amiibo(object)]
case let .AmiiboList(list):
return list
.map { Amiibo($0) }
.sorted { $0.identifier < $1.identifier }
}
}
/// Retrieves a list of items that conforms to the `KeyNameModel` protocol from a wrapper container.
/// - Parameter wrapper: A wrapper container that either has an object or a list of items.
/// - Returns: A list of items that conforms to the `KeyNameModel` protocol, sorted by keys.
func map<Model: KeyNameModel>(
_ wrapper: Components.Schemas.TupleWrapper
) -> [Model] {
switch wrapper.amiibo {
case let .Tuple(payload):
return [Model(payload)]
case let .TupleList(list):
return list
.map { Model($0) }
.sorted { $0.key < $1.key }
} }
} }
@@ -1,35 +1,59 @@
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors // See CONTRIBUTORS for the list of Amiibo Service project authors
// //
// SPDX-License-Identifier: Apache-2.0 // SPDX-License-Identifier: Apache-2.0
// //
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
/// A representation of all the possible errors that the ``AmiiboService`` service could throw. import Foundation
/// An error thrown by ``AmiiboService`` and ``AmiiboClient`` methods.
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 service is 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.
///
/// When no amiibos match, ``AmiiboService/getAmiibos(_:)`` returns an empty array instead of throwing this error.
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. /// Any other error, with a description of the underlying one.
case unknown case unknown(_ description: String)
} }
// MARK: - Equatable // MARK: - Equatable
extension AmiiboServiceError: Equatable {} extension AmiiboServiceError: Equatable {}
// MARK: - LocalizedError
extension AmiiboServiceError: LocalizedError {
// MARK: Properties
public var errorDescription: String? {
switch self {
case .badRequest: "The request was malformed or contained invalid filter parameters."
case .cancelled: "The request was cancelled before a response was received."
case .decoding: "The response body could not be decoded into the expected model."
case .notAvailable: "The backend service is currently unreachable due to a network or server issue."
case .notFound: "No results were found matching the given filter criteria."
case .undocumented(let statusCode): "The server returned an undocumented HTTP status code: \(statusCode)."
case .unknown(let description): "An unexpected error occurred: \(description)"
}
}
}
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -12,55 +12,57 @@
// //
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
/// A type that contains values to fine-tune a response when requesting amiibo items. /// A filter for amiibo requests.
public struct AmiiboFilter: Sendable { ///
/// Values left as `nil` do not restrict the result.
public struct AmiiboFilter: Sendable, Hashable {
// MARK: Properties // MARK: Properties
/// A game character to filter the result, if any. /// A game character key or name to match, if any.
public let gameCharacter: String? public let gameCharacter: String?
/// A game series to filter the result, if any. /// A game series key or name to match, if any.
public let gameSeries: String? public let gameSeries: String?
/// A first part of an identifier to filter the result, if any. /// The first 8 hexadecimal characters of an identifier to match, if any. Shorter values match as a prefix.
public let head: String? public let head: String?
/// An amiibo identifier to filter the result, if any. /// A full 16-character hexadecimal identifier to match, if any.
public let identifier: String? public let identifier: String?
/// An amiibo name to filter the result, if any. /// An amiibo name, or part of one, to match, if any.
public let name: String? public let name: String?
/// An amiibo series to filter the result, if any. /// An amiibo series key or name to match, if any.
public let series: String? public let series: String?
/// A flag indicating whether to include games in the response, if any. /// Whether to include related games in ``Amiibo/platform``. `nil` means `false`.
public let showGames: Bool? public let showGames: Bool?
/// A flag indicating whether to include amiibo usages in games in the response, if any. /// Whether to include related games and their usages in ``Amiibo/platform``. `nil` means `false`.
public let showUsage: Bool? public let showUsage: Bool?
/// A last part of an identifier to filter the result, if any. /// The last 8 hexadecimal characters of an identifier to match, if any. Shorter values match as a prefix.
public let tail: String? public let tail: String?
/// An amiibo type to filter the result, if any. /// An amiibo type key or name to match, if any.
public let type: String? public let type: String?
// MARK: Initializers // MARK: Initializers
/// Initializes this filter. /// Initializes this filter.
/// - Parameters: /// - Parameters:
/// - head: A first part of an identifier to filter the result, if any. /// - head: The first 8 hexadecimal characters of an identifier to match, if any. Shorter values match as a prefix.
/// - tail: A last part of an identifier to filter the result, if any. /// - tail: The last 8 hexadecimal characters of an identifier to match, if any. Shorter values match as a prefix.
/// - identifier: An amiibo identifier to filter the result, if any. /// - identifier: A full 16-character hexadecimal identifier to match, if any.
/// - name: An amiibo name to filter the result, if any. /// - name: An amiibo name, or part of one, to match, if any.
/// - type: An amiibo type to filter the result, if any. /// - type: An amiibo type key or name to match, if any.
/// - series: An amiibo series to filter the result, if any. /// - series: An amiibo series key or name to match, if any.
/// - gameCharacter: A game character to filter the result, if any. /// - gameCharacter: A game character key or name to match, if any.
/// - gameSeries: A game series to filter the result, if any. /// - gameSeries: A game series key or name to match, if any.
/// - showGames: A flag indicating whether to include games in the response, if any. /// - showGames: Whether to include related games in ``Amiibo/platform``. `nil` means `false`.
/// - showUsage: A flag indicating whether to include amiibo usages in games in the response, if any. /// - showUsage: Whether to include related games and their usages in ``Amiibo/platform``. `nil` means `false`.
public init( public init(
head: String? = nil, head: String? = nil,
tail: String? = nil, tail: String? = nil,
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -12,36 +12,36 @@
// //
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
/// A type that contains values to fine-tune a response when requesting amiibo series. /// A filter for amiibo series requests.
public struct AmiiboSeriesFilter: KeyNameFilter, Sendable { public struct AmiiboSeriesFilter: KeyNameFilter, Sendable {
// TODO: Remove the documentation from the properties and initializers of this type as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?). // TODO: Remove the documentation from the properties and initializers of this type as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?).
// MARK: Properties // MARK: Properties
/// A key to return, if any. /// A hexadecimal key in `0x` format, such as `0x01`, to match exactly, if any.
public let key: String? public let key: String?
/// A name to return, if any. /// A name, or part of one, to match, if any.
public let name: String? public let name: String?
// MARK: Initializers // MARK: Initializers
/// Initializes this filter without key or name values. /// Initializes a filter that matches every amiibo series.
public init() { public init() {
self.key = nil self.key = nil
self.name = nil self.name = nil
} }
/// Initializes this filter with a key value. /// Initializes a filter that matches the amiibo series with a given key.
/// - Parameter key: A key to return. /// - Parameter key: A hexadecimal key in `0x` format, such as `0x01`.
public init(key: String) { public init(key: String) {
self.key = key self.key = key
self.name = nil self.name = nil
} }
/// Initializes this filter with a name value. /// Initializes a filter that matches amiibo series by name.
/// - Parameter name: A name to return. /// - Parameter name: A name, or part of one.
public init(name: String) { public init(name: String) {
self.key = nil self.key = nil
self.name = name self.name = name
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -12,36 +12,36 @@
// //
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
/// A type that contains values to fine-tune a response when requesting amiibo types. /// A filter for amiibo type requests.
public struct AmiiboTypeFilter: KeyNameFilter, Sendable { public struct AmiiboTypeFilter: KeyNameFilter, Sendable {
// TODO: Remove the documentation from the properties and initializers of this type as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?). // TODO: Remove the documentation from the properties and initializers of this type as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?).
// MARK: Properties // MARK: Properties
/// A key to return, if any. /// A hexadecimal key in `0x` format, such as `0x01`, to match exactly, if any.
public let key: String? public let key: String?
/// A name to return, if any. /// A name, or part of one, to match, if any.
public let name: String? public let name: String?
// MARK: Initializers // MARK: Initializers
/// Initializes this filter without key or name values. /// Initializes a filter that matches every amiibo type.
public init() { public init() {
self.key = nil self.key = nil
self.name = nil self.name = nil
} }
/// Initializes this filter with a key value. /// Initializes a filter that matches the amiibo type with a given key.
/// - Parameter key: A key to return. /// - Parameter key: A hexadecimal key in `0x` format, such as `0x01`.
public init(key: String) { public init(key: String) {
self.key = key self.key = key
self.name = nil self.name = nil
} }
/// Initializes this filter with a name value. /// Initializes a filter that matches amiibo types by name.
/// - Parameter name: A name to return. /// - Parameter name: A name, or part of one.
public init(name: String) { public init(name: String) {
self.key = nil self.key = nil
self.name = name self.name = name
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -12,36 +12,36 @@
// //
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
/// A type that contains values to fine-tune a response when requesting game characters. /// A filter for game character requests.
public struct GameCharacterFilter: KeyNameFilter, Sendable { public struct GameCharacterFilter: KeyNameFilter, Sendable {
// TODO: Remove the documentation from the properties and initializers of this type as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?). // TODO: Remove the documentation from the properties and initializers of this type as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?).
// MARK: Properties // MARK: Properties
/// A key to return, if any. /// A hexadecimal key in `0x` format, such as `0x0001`, to match exactly, if any.
public let key: String? public let key: String?
/// A name to return, if any. /// A name, or part of one, to match, if any.
public let name: String? public let name: String?
// MARK: Initializers // MARK: Initializers
/// Initializes this filter without key or name values. /// Initializes a filter that matches every game character.
public init() { public init() {
self.key = nil self.key = nil
self.name = nil self.name = nil
} }
/// Initializes this filter with a key value. /// Initializes a filter that matches the game character with a given key.
/// - Parameter key: A key to return. /// - Parameter key: A hexadecimal key in `0x` format, such as `0x0001`.
public init(key: String) { public init(key: String) {
self.key = key self.key = key
self.name = nil self.name = nil
} }
/// Initializes this filter with a name value. /// Initializes a filter that matches game characters by name.
/// - Parameter name: A name to return. /// - Parameter name: A name, or part of one.
public init(name: String) { public init(name: String) {
self.key = nil self.key = nil
self.name = name self.name = name
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -12,36 +12,36 @@
// //
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
/// A type that contains values to fine-tune a response when requesting game series. /// A filter for game series requests.
public struct GameSeriesFilter: KeyNameFilter, Sendable { public struct GameSeriesFilter: KeyNameFilter, Sendable {
// TODO: Remove the documentation from the properties and initializers of this type as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?). // TODO: Remove the documentation from the properties and initializers of this type as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?).
// MARK: Properties // MARK: Properties
/// A key to return, if any. /// A hexadecimal key in `0x` format, such as `0x001`, to match exactly, if any.
public let key: String? public let key: String?
/// A name to return, if any. /// A name, or part of one, to match, if any.
public let name: String? public let name: String?
// MARK: Initializers // MARK: Initializers
/// Initializes this filter without key or name values. /// Initializes a filter that matches every game series.
public init() { public init() {
self.key = nil self.key = nil
self.name = nil self.name = nil
} }
/// Initializes this filter with a key value. /// Initializes a filter that matches the game series with a given key.
/// - Parameter key: A key to return. /// - Parameter key: A hexadecimal key in `0x` format, such as `0x001`.
public init(key: String) { public init(key: String) {
self.key = key self.key = key
self.name = nil self.name = nil
} }
/// Initializes this filter with a name value. /// Initializes a filter that matches game series by name.
/// - Parameter name: A name to return. /// - Parameter name: A name, or part of one.
public init(name: String) { public init(name: String) {
self.key = nil self.key = nil
self.name = name self.name = name
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -14,43 +14,70 @@
import Foundation import Foundation
/// A model that represents an amiibo item. /// A model that represents an amiibo.
public struct Amiibo: Sendable { public struct Amiibo: Sendable, Hashable, Codable, Identifiable {
// 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 related games of this amiibo, grouped by platform.
///
/// `nil` unless the request sets ``AmiiboFilter/showGames`` or ``AmiiboFilter/showUsage``, or when there are no related games.
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
/// Initializes this model.
package init(
head: String,
tail: String,
name: String,
type: String,
series: String,
gameCharacter: String,
gameSeries: String,
image: String,
release: Release = .init(),
platform: Platform? = nil
) {
self.gameCharacter = gameCharacter
self.gameSeries = gameSeries
self.head = head
self.image = image
self.name = name
self.platform = platform
self.release = release
self.series = series
self.tail = tail
self.type = type
}
/// Initializes this model from a given payload. /// Initializes this model from a given payload.
/// - Parameter payload: A payload that contains the values for the model. /// - Parameter payload: A payload that contains the values for the model.
init(_ payload: Components.Schemas.Amiibo) { init(_ payload: Components.Schemas.Amiibo) {
@@ -61,6 +88,7 @@ public struct Amiibo: Sendable {
self.name = payload.name self.name = payload.name
self.platform = .init( self.platform = .init(
payload.gamesSwitch, payload.gamesSwitch,
payload.gamesSwitch2,
payload.games3DS, payload.games3DS,
payload.gamesWiiU payload.gamesWiiU
) )
@@ -71,13 +99,18 @@ public struct Amiibo: Sendable {
} }
// MARK: Computed // MARK: Computed
/// An identifier. /// The ``identifier`` of this amiibo.
public var id: String {
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)
} }
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -13,22 +13,33 @@
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
extension Amiibo { extension Amiibo {
/// A model that represents a game related to an amiibo item. /// A model that represents a game related to an amiibo.
public struct Game: Sendable { public struct Game: Sendable, Hashable, Codable {
// 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, or `nil` unless the request sets ``AmiiboFilter/showUsage``.
public let usages: [Usage]? public let usages: [Usage]?
// MARK: Initializers // MARK: Initializers
/// Initializes this model.
package init(
identifiers: [String],
name: String,
usages: [Usage]? = nil
) {
self.identifiers = identifiers
self.name = name
self.usages = usages
}
/// Initializes this model from a given payload. /// Initializes this model from a given payload.
/// - Parameter payload: A payload that contains the values for the model. /// - Parameter payload: A payload that contains the values for the model.
init(_ payload: Components.Schemas.AmiiboGame) { init(_ payload: Components.Schemas.AmiiboGame) {
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -13,54 +13,65 @@
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
extension Amiibo { extension Amiibo {
/// A model that represents a collection of `WiiU`, `3DS`, and `Switch` games related to an amiibo item. /// A model that groups the games related to an amiibo by platform.
public struct Platform: Sendable { public struct Platform: Sendable, Hashable, Codable {
// MARK: Properties // MARK: Properties
/// A list of `Switch` games related to an amiibo item. /// A list of `Switch` games related to an amiibo.
public let `switch`: [Game] public let `switch`: [Game]
/// A list of `Switch 2` games related to an amiibo.
public let switch2: [Game]
/// A list of `3DS` games related to an amiibo item. /// 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 item. /// A list of `Wii U` games related to an amiibo.
public let wiiU: [Game] public let wiiU: [Game]
// MARK: Initialisers // MARK: Initializers
/// Initializes this model. /// Initializes this model.
package init(
`switch`: [Game] = [],
switch2: [Game] = [],
threeDS: [Game] = [],
wiiU: [Game] = []
) {
self.switch = `switch`
self.switch2 = switch2
self.threeDS = threeDS
self.wiiU = wiiU
}
/// Initializes this model from the given payloads.
/// ///
/// > important: In case no data is provided, then an instance of this model is not created. /// > important: In case no data is provided, then an instance of this model is not created.
/// ///
/// - Parameters: /// - Parameters:
/// - switch: A list of `Switch` games related to an amiibo item, if any. /// - switch: A list of `Switch` games related to an amiibo, if any.
/// - threeDS: A list of `3DS` games related to an amiibo item, if any. /// - switch2: A list of `Switch 2` games related to an amiibo, if any.
/// - wiiU: A list of `WiiU` games related to an amiibo item, if any. /// - threeDS: A list of `3DS` 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]?,
_ threeDS: [Components.Schemas.AmiiboGame]?, _ threeDS: [Components.Schemas.AmiiboGame]?,
_ wiiU: [Components.Schemas.AmiiboGame]? _ wiiU: [Components.Schemas.AmiiboGame]?
) { ) {
guard (`switch` != nil && `switch`?.isEmpty == false) guard `switch`?.isEmpty == false
|| (threeDS != nil && threeDS?.isEmpty == false) || switch2?.isEmpty == false
|| (wiiU != nil && wiiU?.isEmpty == false) || threeDS?.isEmpty == false
|| wiiU?.isEmpty == false
else { else {
return nil return nil
} }
self.switch = { self.switch = `switch`?.map { .init($0) } ?? []
guard let `switch` else { return [] } self.switch2 = switch2?.map { .init($0) } ?? []
return `switch`.map { .init($0) } self.threeDS = threeDS?.map { .init($0) } ?? []
}() self.wiiU = wiiU?.map { .init($0) } ?? []
self.threeDS = {
guard let threeDS else { return [] }
return threeDS.map { .init($0) }
}()
self.wiiU = {
guard let wiiU else { return [] }
return wiiU.map { .init($0) }
}()
} }
} }
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -15,8 +15,10 @@
import Foundation import Foundation
extension Amiibo { extension Amiibo {
/// A model that represents a collection of release dates related to an amiibo item. /// A model that represents the regional release dates of an amiibo.
public struct Release: Sendable { ///
/// The service provides these dates as date-only values, which are decoded as midnight UTC.
public struct Release: Sendable, Hashable, Codable {
// MARK: Properties // MARK: Properties
@@ -34,6 +36,19 @@ extension Amiibo {
// MARK: Initializers // MARK: Initializers
/// Initializes this model.
package init(
america: Date? = nil,
australia: Date? = nil,
europe: Date? = nil,
japan: Date? = nil
) {
self.america = america
self.australia = australia
self.europe = europe
self.japan = japan
}
/// Initializes this model from a given payload. /// Initializes this model from a given payload.
/// - Parameter payload: A payload that contains the values for the model. /// - Parameter payload: A payload that contains the values for the model.
init(_ payload: Components.Schemas.AmiiboRelease) { init(_ payload: Components.Schemas.AmiiboRelease) {
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -13,19 +13,25 @@
// ===----------------------------------------------------------------------=== // ===----------------------------------------------------------------------===
extension Amiibo { extension Amiibo {
/// A model that represents the usage of an amiibo item within a certain game. /// A model that represents the usage of an amiibo within a certain game.
public struct Usage: Sendable { public struct Usage: Sendable, Hashable, Codable {
// MARK: Properties // MARK: Properties
/// An explanation of how to use an amiibo item. /// 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 item can save game data in it. /// Whether the amiibo can save game data.
public let isWriteable: Bool public let isWriteable: Bool
// MARK: Initializers // MARK: Initializers
/// Initializes this model.
package init(explanation: String, isWriteable: Bool) {
self.explanation = explanation
self.isWriteable = isWriteable
}
/// Initializes this model from a given payload. /// Initializes this model from a given payload.
/// - Parameter payload: A payload that contains the values for the model. /// - Parameter payload: A payload that contains the values for the model.
init(_ payload: Components.Schemas.AmiiboUsage) { init(_ payload: Components.Schemas.AmiiboUsage) {
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -14,22 +14,35 @@
/// A model that represents an amiibo series. /// A model that represents an amiibo series.
public struct AmiiboSeries: KeyNameModel { public struct AmiiboSeries: KeyNameModel {
// TODO: Remove the documentation from the properties of this type as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?).
// MARK: Properties // MARK: Properties
/// A key. /// The hexadecimal key that uniquely identifies this amiibo series.
public let key: String public let key: String
/// A name. /// The name of this amiibo series.
public let name: String public let name: String
// MARK: Initializers // MARK: Initializers
init(_ payload: Components.Schemas.Tuple) { /// Initializes this model.
package init(key: String, name: String) {
self.key = key
self.name = name
}
/// Initializes this model from a given payload.
/// - Parameter payload: A payload that contains the values for the model.
init(_ payload: some KeyNamePayload) {
self.key = payload.key self.key = payload.key
self.name = payload.name self.name = payload.name
} }
// MARK: Computed
/// The ``key`` of this amiibo series.
public var id: String {
key
}
} }
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -15,21 +15,34 @@
/// A model that represents an amiibo type. /// A model that represents an amiibo type.
public struct AmiiboType: KeyNameModel { public struct AmiiboType: KeyNameModel {
// TODO: Remove the documentation from the properties of this type as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?).
// MARK: Properties // MARK: Properties
/// A key. /// The hexadecimal key that uniquely identifies this amiibo type.
public let key: String public let key: String
/// A 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
init(_ payload: Components.Schemas.Tuple) { /// Initializes this model.
package init(key: String, name: String) {
self.key = key
self.name = name
}
/// Initializes this model from a given payload.
/// - Parameter payload: A payload that contains the values for the model.
init(_ payload: some KeyNamePayload) {
self.key = payload.key self.key = payload.key
self.name = payload.name self.name = payload.name
} }
// MARK: Computed
/// The ``key`` of this amiibo type.
public var id: String {
key
}
} }
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -15,21 +15,34 @@
/// A model that represents a game character. /// A model that represents a game character.
public struct GameCharacter: KeyNameModel { public struct GameCharacter: KeyNameModel {
// TODO: Remove the documentation from the properties of this type as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?).
// MARK: Properties // MARK: Properties
/// A key. /// The hexadecimal key that uniquely identifies this game character.
public let key: String public let key: String
/// A name. /// The name of this game character.
public let name: String public let name: String
// MARK: Initializers // MARK: Initializers
init(_ payload: Components.Schemas.Tuple) { /// Initializes this model.
package init(key: String, name: String) {
self.key = key
self.name = name
}
/// Initializes this model from a given payload.
/// - Parameter payload: A payload that contains the values for the model.
init(_ payload: some KeyNamePayload) {
self.key = payload.key self.key = payload.key
self.name = payload.name self.name = payload.name
} }
// MARK: Computed
/// The ``key`` of this game character.
public var id: String {
key
}
} }
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -15,21 +15,34 @@
/// A model that represents a game series. /// A model that represents a game series.
public struct GameSeries: KeyNameModel { public struct GameSeries: KeyNameModel {
// TODO: Remove the documentation from the properties of this type as the `--enable-inherited-docs` flag when generating DocC documentation is not working as intended (?).
// MARK: Properties // MARK: Properties
/// A key. /// The hexadecimal key that uniquely identifies this game series.
public let key: String public let key: String
/// A name. /// The name of this game series.
public let name: String public let name: String
// MARK: Initializers // MARK: Initializers
init(_ payload: Components.Schemas.Tuple) { /// Initializes this model.
package init(key: String, name: String) {
self.key = key
self.name = name
}
/// Initializes this model from a given payload.
/// - Parameter payload: A payload that contains the values for the model.
init(_ payload: some KeyNamePayload) {
self.key = payload.key self.key = payload.key
self.name = payload.name self.name = payload.name
} }
// MARK: Computed
/// The ``key`` of this game series.
public var id: String {
key
}
} }
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -14,81 +14,46 @@
import Foundation import Foundation
/// A protocol that defines API clients containing all available endpoints to interact with. /// A protocol that defines a client that fetches data from the Amiibo API.
public protocol AmiiboClient { ///
/// ``AmiiboLiveClient`` is the default implementation; conform to provide another, such as a mock. Conforming types must be `Sendable`.
public protocol AmiiboClient: Sendable {
// MARK: Functions // MARK: Functions
#if swift(>=6.0)
/// Gets a list of amiibo items based on a given filter. /// Gets a list of amiibo items based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered amiibo items. /// - Returns: A list of filtered amiibo items.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
func getAmiibos(by filter: AmiiboFilter) async throws(AmiiboServiceError) -> [Amiibo] func getAmiibos(by filter: AmiiboFilter) async throws(AmiiboServiceError) -> [Amiibo]
/// Gets a list of amiibo series based on a given filter. /// Gets a list of amiibo series based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered amiibo series. /// - Returns: A list of filtered amiibo series.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
func getAmiiboSeries(by filter: AmiiboSeriesFilter) async throws(AmiiboServiceError) -> [AmiiboSeries] func getAmiiboSeries(by filter: AmiiboSeriesFilter) async throws(AmiiboServiceError) -> [AmiiboSeries]
/// Gets a list of amiibo types based on a given filter. /// Gets a list of amiibo types based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered amiibo types. /// - Returns: A list of filtered amiibo types.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
func getAmiiboTypes(by filter: AmiiboTypeFilter) async throws(AmiiboServiceError) -> [AmiiboType] func getAmiiboTypes(by filter: AmiiboTypeFilter) async throws(AmiiboServiceError) -> [AmiiboType]
/// Gets a list of game characters based on a given filter. /// Gets a list of game characters based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered game characters. /// - Returns: A list of filtered game characters.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
func getGameCharacters(by filter: GameCharacterFilter) async throws(AmiiboServiceError) -> [GameCharacter] func getGameCharacters(by filter: GameCharacterFilter) async throws(AmiiboServiceError) -> [GameCharacter]
/// Gets a list of game series based on a given filter. /// Gets a list of game series based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered game series. /// - Returns: A list of filtered game series.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
func getGameSeries(by filter: GameSeriesFilter) async throws(AmiiboServiceError) -> [GameSeries] func getGameSeries(by filter: GameSeriesFilter) async throws(AmiiboServiceError) -> [GameSeries]
/// Gets the date when the data was last updated. /// Gets the date when the data was last updated.
/// - Returns: A last updated date. /// - Returns: A last updated date, decoded as UTC.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
func getLastUpdated() async throws(AmiiboServiceError) -> Date func getLastUpdated() async throws(AmiiboServiceError) -> Date
#else
/// Gets a list of amiibo items based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered amiibo items.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
func getAmiibos(by filter: AmiiboFilter) async throws -> [Amiibo]
/// Gets a list of amiibo series based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered amiibo series.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
func getAmiiboSeries(by filter: AmiiboSeriesFilter) async throws -> [AmiiboSeries]
/// Gets a list of amiibo types based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered amiibo types.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
func getAmiiboTypes(by filter: AmiiboTypeFilter) async throws -> [AmiiboType]
/// Gets a list of game characters based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered game characters.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
func getGameCharacters(by filter: GameCharacterFilter) async throws -> [GameCharacter]
/// Gets a list of game series based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered game series.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
func getGameSeries(by filter: GameSeriesFilter) async throws -> [GameSeries]
/// Gets the date when the data was last updated.
/// - Returns: A last updated date.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
func getLastUpdated() async throws -> Date
#endif
} }
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -14,29 +14,30 @@
import Foundation import Foundation
/// A type that implements the service that uses a client to make calls. /// The entry point for fetching data from the Amiibo API.
public struct AmiiboService { ///
/// It forwards every call to the ``AmiiboClient`` given at initialization, which defaults to ``AmiiboLiveClient``. Instances are `Sendable`.
public struct AmiiboService: Sendable {
// MARK: Properties // MARK: Properties
/// A client to interact with the endpoints. /// A client to interact with the endpoints.
private let client: any AmiiboClient private let client: any AmiiboClient
// MARK: Initializers // MARK: Initializers
/// Initializes this service with a specific client type. /// Initializes this service with a client.
/// - Parameter client: A client to use to interact with the endpoints. /// - Parameter client: The client that performs the calls. Defaults to ``AmiiboLiveClient``.
public init(client: some AmiiboClient = AmiiboLiveClient()) { public init(client: some AmiiboClient = AmiiboLiveClient()) {
self.client = client self.client = client
} }
// MARK: Functions // MARK: Functions
#if swift(>=6.0)
/// Gets a list of amiibo items based on a given filter. /// Gets a list of amiibo items based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered amiibo items. /// - Returns: A list of filtered amiibo items.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
public func getAmiibos( public func getAmiibos(
_ filter: AmiiboFilter = .init() _ filter: AmiiboFilter = .init()
) async throws(AmiiboServiceError) -> [Amiibo] { ) async throws(AmiiboServiceError) -> [Amiibo] {
@@ -44,9 +45,9 @@ public struct AmiiboService {
} }
/// Gets a list of amiibo series based on a given filter. /// Gets a list of amiibo series based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered amiibo series. /// - Returns: A list of filtered amiibo series.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
public func getAmiiboSeries( public func getAmiiboSeries(
_ filter: AmiiboSeriesFilter = .init() _ filter: AmiiboSeriesFilter = .init()
) async throws(AmiiboServiceError) -> [AmiiboSeries] { ) async throws(AmiiboServiceError) -> [AmiiboSeries] {
@@ -54,9 +55,9 @@ public struct AmiiboService {
} }
/// Gets a list of amiibo types based on a given filter. /// Gets a list of amiibo types based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered amiibo types. /// - Returns: A list of filtered amiibo types.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
public func getAmiiboTypes( public func getAmiiboTypes(
_ filter: AmiiboTypeFilter = .init() _ filter: AmiiboTypeFilter = .init()
) async throws(AmiiboServiceError) -> [AmiiboType] { ) async throws(AmiiboServiceError) -> [AmiiboType] {
@@ -64,9 +65,9 @@ public struct AmiiboService {
} }
/// Gets a list of game characters based on a given filter. /// Gets a list of game characters based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered game characters. /// - Returns: A list of filtered game characters.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
public func getGameCharacters( public func getGameCharacters(
_ filter: GameCharacterFilter = .init() _ filter: GameCharacterFilter = .init()
) async throws(AmiiboServiceError) -> [GameCharacter] { ) async throws(AmiiboServiceError) -> [GameCharacter] {
@@ -74,9 +75,9 @@ public struct AmiiboService {
} }
/// Gets a list of game series based on a given filter. /// Gets a list of game series based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result. /// - Parameter filter: A filter for the result.
/// - Returns: A list of filtered game series. /// - Returns: A list of filtered game series.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
public func getGameSeries( public func getGameSeries(
_ filter: GameSeriesFilter = .init() _ filter: GameSeriesFilter = .init()
) async throws(AmiiboServiceError) -> [GameSeries] { ) async throws(AmiiboServiceError) -> [GameSeries] {
@@ -84,68 +85,10 @@ public struct AmiiboService {
} }
/// Gets the date when the data was last updated. /// Gets the date when the data was last updated.
/// - Returns: A last updated date. /// - Returns: A last updated date, decoded as UTC.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result. /// - Throws: An ``AmiiboServiceError`` if the call fails.
public func getLastUpdated() async throws(AmiiboServiceError) -> Date { public func getLastUpdated() async throws(AmiiboServiceError) -> Date {
try await client.getLastUpdated() try await client.getLastUpdated()
} }
#else
/// Gets a list of amiibo items based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered amiibo items.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
public func getAmiibos(
_ filter: AmiiboFilter = .init()
) async throws -> [Amiibo] {
try await client.getAmiibos(by: filter)
}
/// Gets a list of amiibo series based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered amiibo series.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
public func getAmiiboSeries(
_ filter: AmiiboSeriesFilter = .init()
) async throws -> [AmiiboSeries] {
try await client.getAmiiboSeries(by: filter)
}
/// Gets a list of amiibo types based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered amiibo types.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
public func getAmiiboTypes(
_ filter: AmiiboTypeFilter = .init()
) async throws -> [AmiiboType] {
try await client.getAmiiboTypes(by: filter)
}
/// Gets a list of game characters based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered game characters.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
public func getGameCharacters(
_ filter: GameCharacterFilter = .init()
) async throws -> [GameCharacter] {
try await client.getGameCharacters(by: filter)
}
/// Gets a list of game series based on a given filter.
/// - Parameter filter: A filter to remove unwanted items from the result.
/// - Returns: A list of filtered game series.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
public func getGameSeries(
_ filter: GameSeriesFilter = .init()
) async throws -> [GameSeries] {
try await client.getGameSeries(by: filter)
}
/// Gets the date when the data was last updated.
/// - Returns: A last updated date.
/// - Throws: An ``AmiiboServiceError`` error in case some issue is encountered while generating the result.
public func getLastUpdated() async throws -> Date {
try await client.getLastUpdated()
}
#endif
} }
@@ -2,7 +2,7 @@
## ##
## This source file is part of the Amiibo Service open source project ## This source file is part of the Amiibo Service open source project
## ##
## Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors ## Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
## Licensed under Apache license v2.0 ## Licensed under Apache license v2.0
## ##
## See LICENSE for license information ## See LICENSE for license information
+412 -248
View File
@@ -2,7 +2,7 @@
## ##
## This source file is part of the Amiibo Service open source project ## This source file is part of the Amiibo Service open source project
## ##
## Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors ## Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
## Licensed under Apache license v2.0 ## Licensed under Apache license v2.0
## ##
## See LICENSE for license information ## See LICENSE for license information
@@ -17,15 +17,16 @@ info:
title: Amiibo API title: Amiibo API
summary: A RESTFul API for Amiibo. summary: A RESTFul API for Amiibo.
description: | description: |
# information # Information
_AmiiboAPI_ is primarily used for educational purposes. The [AmiiboAPI](https://www.amiiboapi.org) service is primarily used for educational purposes.
This is a **reading-only API**. Only HTTP GET method is allowed by this API. This is a **reading-only API**. Only HTTP GET method is allowed by this API.
**No authentication** is required to use this API. All resources are allowed to access. **No authentication** is required to use this API. All resources are allowed to access.
If you are going to be calling this API regularly. We recommend that you use **caching** on your system. If you are going to be calling this API regularly. We recommend that you use **caching** on your system.
# Terms & Conditions # Terms & Conditions
By using our API, you hereby accepted the following terms and conditions: By using our API, you hereby accepted the following terms and conditions:
* *This API has no affiliation with Nintendo or any other companies that own the rights to it.* * *This API has no affiliation with Nintendo or any other companies that own the rights to it.*
@@ -34,16 +35,19 @@ info:
* *You will require your end users to comply with (and not knowingly enable them to violate) applicable law, regulation, and the Terms.* * *You will require your end users to comply with (and not knowingly enable them to violate) applicable law, regulation, and the Terms.*
* *You will comply with all applicable law, regulation, and third party rights (including without limitation laws regarding the import or export of data or software, privacy, and local laws). You will not use the APIs to encourage or promote illegal activity or violation of third party rights.* * *You will comply with all applicable law, regulation, and third party rights (including without limitation laws regarding the import or export of data or software, privacy, and local laws). You will not use the APIs to encourage or promote illegal activity or violation of third party rights.*
* *These Terms and Conditions are subject to change without notice, from time to time in our sole discretion.* * *These Terms and Conditions are subject to change without notice, from time to time in our sole discretion.*
version: v1.0.0 version: 1.0.0
termsOfService: https://www.amiiboapi.com/docs/#termscondition termsOfService: https://www.amiiboapi.org/docs/#termscondition
contact: contact:
name: FAQ name: FAQ
url: https://www.amiiboapi.com/faq/ url: https://www.amiiboapi.org/faq/
license: license:
name: MIT license name: MIT license
identifier: MIT identifier: MIT
externalDocs:
url: https://www.amiiboapi.org/docs
description: Amiibo API documentation
servers: servers:
- url: https://www.amiiboapi.com/api - url: https://www.amiiboapi.org/api
description: Live service description: Live service
tags: tags:
- name: Amiibo - name: Amiibo
@@ -52,304 +56,342 @@ tags:
description: Game-related endpoints. description: Game-related endpoints.
- name: Service - name: Service
description: Service-related endpoints. description: Service-related endpoints.
externalDocs:
url: https://www.amiiboapi.com/docs
description: Amiibo API documentation
paths: paths:
/amiibo: /amiibo:
get: get:
summary: Get a list of Amiibo items. summary: Get a list of amiibos.
description: Get a list of all the Amiibo items available in the database. description: |
Get a list of all the amiibo items available in the database, optionally filtered by various criteria such as name, type, series, or game.
Please refer to [the documentation of the endpoint](https://www.amiiboapi.org/docs/#amiibo) for further information.
operationId: getAmiibos operationId: getAmiibos
tags: tags:
- Amiibo - Amiibo
parameters:
- $ref: '#/components/parameters/Identifier'
- $ref: '#/components/parameters/IdentifierHead'
- $ref: '#/components/parameters/IdentifierTail'
- $ref: '#/components/parameters/Name'
description: A name of an amiibo to include in the response.
- $ref: '#/components/parameters/AmiiboType'
- $ref: '#/components/parameters/AmiiboSeries'
- $ref: '#/components/parameters/GameCharacter'
- $ref: '#/components/parameters/GameSeries'
- $ref: '#/components/parameters/ShowGames'
- $ref: '#/components/parameters/ShowUsage'
responses: responses:
'200': '200':
description: Response that retuns a decodable JSON object wrapping a list of Amiibo items. description: Successful response returning an object that contains zero, one or more amiibos matching the filter criteria.
content: content:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/AmiiboWrapper' $ref: '#/components/schemas/AmiiboWrapper'
'400': '400':
description: An amiibo bad request. $ref: '#/components/responses/BadRequest'
'404': '404':
description: An amiibo not found. $ref: '#/components/responses/NotFound'
'500': '500':
description: Service is not available. $ref: '#/components/responses/InternalServerError'
parameters:
- name: amiiboSeries
in: query
description: An identifier or name of an Amiibo to filter the response.
required: false
schema:
type: string
style: form
- name: character
in: query
description: An identifier or name of a game character to filter the response.
required: false
schema:
type: string
style: form
- name: gameseries
in: query
description: An identifier or name of a game series to filter the response.
required: false
schema:
type: string
style: form
- name: head
in: query
description: A last part of an identifier to filter the response.
required: false
schema:
type: string
style: form
- name: id
in: query
description: An identifier of an Amiibo to filter the response.
required: false
schema:
type: string
style: form
- name: name
in: query
description: A name of an Amiibo to filter the response.
required: false
schema:
type: string
style: form
- name: showgames
in: query
description: A flag that indicates whether to include information about related games.
required: false
schema:
type: boolean
style: form
- name: showusage
in: query
description: A flag that indicates whether to include information about Amiibo usage in related games.
required: false
schema:
type: boolean
style: form
- name: tail
in: query
description: A first part of an identifier to filter the response.
required: false
schema:
type: string
style: form
- name: type
in: query
description: An identifier or a name of an Amiibo type to filter the response.
required: false
schema:
type: string
style: form
/amiiboseries: /amiiboseries:
get: get:
description: Get a list of all the Amiibo series available in the database.
operationId: getAmiiboSeries
tags: tags:
- Amiibo - Amiibo
summary: Get the amiibo series.
description: |
Get a list of all the amiibo series available in the database, optionally filtered by key or name.
Please refer to [the documentation of the endpoint](https://www.amiiboapi.org/docs/#series) for further information.
operationId: getAmiiboSeries
parameters:
- $ref: '#/components/parameters/Key'
description: A key of an amiibo series to include in the response.
- $ref: '#/components/parameters/Name'
description: A name of an amiibo series to include in the response.
responses: responses:
'200': '200':
$ref: '#/components/responses/SuccessTuple' description: Successful response returning an object that contains one or more amiibo series matching the filter criteria.
content:
application/json:
schema:
$ref: '#/components/schemas/AmiiboSeriesWrapper'
'400': '400':
description: An amiibo series bad request. $ref: '#/components/responses/BadRequest'
'404': '404':
description: An amiibo series not found. $ref: '#/components/responses/NotFound'
'500': '500':
description: Service is not available. $ref: '#/components/responses/InternalServerError'
parameters:
- name: key
in: query
description: The Amiibo series key to filter the response.
required: false
schema:
type: string
style: form
- name: name
in: query
description: The Amiibo series name to filter the response.
required: false
schema:
type: string
style: form
/character: /character:
get: get:
description: Get a list of all the game characters available in the database.
operationId: getGameCharacters
tags: tags:
- Game - Game
summary: Get the game characters.
description: |
Get a list of all the game characters available in the database, optionally filtered by key or name.
Please refer to [the documentation of the endpoint](https://www.amiiboapi.org/docs/#character) for further information.
operationId: getGameCharacters
parameters:
- $ref: '#/components/parameters/Key'
description: A key of a game character to include in the response.
- $ref: '#/components/parameters/Name'
description: A name of a game character to include in the response.
responses: responses:
'200': '200':
$ref: '#/components/responses/SuccessTuple' description: Successful response returning an object that contains one or more game characters matching the filter criteria.
content:
application/json:
schema:
$ref: '#/components/schemas/GameCharacterWrapper'
'400': '400':
description: A game character bad request. $ref: '#/components/responses/BadRequest'
'404': '404':
description: A game character not found. $ref: '#/components/responses/NotFound'
'500': '500':
description: Service is not available. $ref: '#/components/responses/InternalServerError'
parameters:
- name: key
in: query
description: The game character key to filter the response.
required: false
schema:
type: string
style: form
- name: name
in: query
description: The game character name to filter the response.
required: false
schema:
type: string
style: form
/gameseries: /gameseries:
get: get:
description: Gets a list of all the game series available in the database.
operationId: getGameSeries
tags: tags:
- Game - Game
summary: Get the game series.
description: |
Get a list of all the game series available in the database, optionally filtered by key or name.
Please refer to [the documentation of the endpoint](https://www.amiiboapi.org/docs/#gameSeries) for further information.
operationId: getGameSeries
parameters:
- $ref: '#/components/parameters/Key'
description: A key of a game series to include in the response.
- $ref: '#/components/parameters/Name'
description: A name of a game series to include in the response.
responses: responses:
'200': '200':
$ref: '#/components/responses/SuccessTuple' description: Successful response returning an object that contains one or more game series matching the filter criteria.
content:
application/json:
schema:
$ref: '#/components/schemas/GameSeriesWrapper'
'400': '400':
description: A game series bad request. $ref: '#/components/responses/BadRequest'
'404': '404':
description: A game series not found. $ref: '#/components/responses/NotFound'
'500': '500':
description: Service is not available. $ref: '#/components/responses/InternalServerError'
parameters:
- name: key
in: query
description: The game series key to filter the response.
required: false
schema:
type: string
style: form
- name: name
in: query
description: The game series name to filter the response.
required: false
schema:
type: string
style: form
/type: /type:
get: get:
description: Gets a list of all the Amiibo types available in the database.
operationId: getAmiiboTypes
tags: tags:
- Amiibo - Amiibo
summary: Get the amiibo types.
description: |
Get a list of all the amiibo types available in the database, optionally filtered by key or name.
Please refer to [the documentation of the endpoint](https://www.amiiboapi.org/docs/#type) for further information.
operationId: getAmiiboTypes
parameters:
- $ref: '#/components/parameters/Key'
description: A key of an amiibo type to include in the response.
- $ref: '#/components/parameters/Name'
description: A name of an amiibo type to include in the response.
responses: responses:
'200': '200':
$ref: '#/components/responses/SuccessTuple' description: Successful response returning an object that contains one or more amiibo types matching the filter criteria.
content:
application/json:
schema:
$ref: '#/components/schemas/AmiiboTypeWrapper'
'400': '400':
description: An amiibo type bad request. $ref: '#/components/responses/BadRequest'
'404': '404':
description: An amiibo type not found. $ref: '#/components/responses/NotFound'
'500': '500':
description: Service is not available. $ref: '#/components/responses/InternalServerError'
parameters:
- name: key
in: query
description: The Amiibo type key to filter the response.
required: false
schema:
type: string
style: form
- name: name
in: query
description: The Amiibo type name to filter the response.
required: false
schema:
type: string
style: form
/lastupdated: /lastupdated:
get: get:
description: Gets a timestamp when the Amiibo data was last updated.
operationId: getLastUpdated
tags: tags:
- Service - Service
summary: Get the date when data was last updated.
description: |
Get an ISO-formatted date and time when the amiibo data was last updated.
Please refer to [the documentation of the endpoint](https://www.amiiboapi.org/docs/#lastUpdated) for further information.
operationId: getLastUpdated
responses: responses:
'200': '200':
description: Successful response returning the object that contains the date and time when the database was last updated. description: Successful response returning an object that contains the date and time when the database was last updated.
content: content:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/LastUpdated' $ref: '#/components/schemas/LastUpdated'
'400':
description: A last updated bad request.
'404':
description: A last updated not found.
'500': '500':
description: Service is not available. $ref: '#/components/responses/InternalServerError'
components: components:
parameters:
AmiiboSeries:
description: A hexadecimal key or name of an amiibo series to include in the response.
name: amiiboSeries
in: query
required: false
schema:
type: string
AmiiboType:
description: A hexadecimal key or name of an amiibo type to include in the response.
name: type
in: query
required: false
schema:
type: string
GameCharacter:
description: A hexadecimal key or name of a game character to include in the response.
name: character
in: query
required: false
schema:
type: string
GameSeries:
description: A hexadecimal key or name of a game series to include in the response.
name: gameseries
in: query
required: false
schema:
type: string
Identifier:
description: The full 16-character hexadecimal identifier of an amiibo to include in the response, with an optional `0x` prefix. An empty value is rejected with a `400` response.
name: id
in: query
required: false
schema:
type: string
pattern: "^(0x)?[0-9a-fA-F]{16}$"
minLength: 16
maxLength: 18
IdentifierHead:
description: The first 8 hexadecimal characters of an amiibo identifier to include in the response, with an optional `0x` prefix. A shorter value matches as a prefix, while an empty value is rejected with a `400` response.
name: head
in: query
required: false
schema:
type: string
pattern: "^(0x)?[0-9a-fA-F]+$"
minLength: 1
maxLength: 10
IdentifierTail:
description: The last 8 hexadecimal characters of an amiibo identifier to include in the response, with an optional `0x` prefix. A shorter value matches as a prefix, while an empty value is rejected with a `400` response.
name: tail
in: query
required: false
schema:
type: string
pattern: "^(0x)?[0-9a-fA-F]+$"
minLength: 1
maxLength: 10
Key:
description: A hexadecimal key to filter the results by, in the `0x`-prefixed format used by the `key` property of the resources. A value without hexadecimal digits after the prefix, or an empty value, is rejected with a `400` response.
name: key
in: query
required: false
schema:
type: string
pattern: "^0x[0-9a-fA-F]+$"
minLength: 3
Name:
description: A name to filter the results by.
name: name
in: query
required: false
schema:
type: string
ShowGames:
description: A flag that indicates whether to include information about related games.
name: showgames
in: query
required: false
schema:
type: boolean
ShowUsage:
description: A flag that indicates whether to include information about amiibo usages in related games.
name: showusage
in: query
required: false
schema:
type: boolean
responses: responses:
SuccessTuple: BadRequest:
description: Response that returns a JSON object containing requested `Tuple` data from a resource. description: The request was malformed or contained invalid parameters.
content: content:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/TupleWrapper' $ref: '#/components/schemas/ServiceError'
InternalServerError:
description: The service is currently unavailable.
NotFound:
description: No results were found matching the given filter criteria.
content:
application/json:
schema:
$ref: '#/components/schemas/ServiceError'
schemas: schemas:
# Core Entities # Core Entities
Amiibo: Amiibo:
description: A type that contains all the information about an Amiibo. description: A type that represents an amiibo figurine, card, or other collectible.
type: object type: object
properties: properties:
amiiboSeries: amiiboSeries:
description: A name of the series the Amiibo belongs to. description: The name of the amiibo series this amiibo belongs to.
type: string type: string
character: character:
description: | description: |
A name of a character of An Amiibo. The name of the game character associated with this amiibo.
Multiple character have different amiibo design. Multiple characters can have different amiibo designs.
type: string type: string
gameSeries: gameSeries:
description: A name of the game series the Amiibo belongs to. description: The name of the game series associated with this amiibo.
type: string type: string
games3DS: games3DS:
description: A list of 3DS games an Amiibo could be used in, if any. description: A list of 3DS games an amiibo could be used in, if any.
type: array type: array
items: items:
$ref: '#/components/schemas/AmiiboGame' $ref: '#/components/schemas/AmiiboGame'
gamesSwitch: gamesSwitch:
description: A list of Switch games an Amiibo could be used in, if any. description: A list of Switch games an amiibo could be used in, if any.
type: array
items:
$ref: '#/components/schemas/AmiiboGame'
gamesSwitch2:
description: A list of Switch 2 games an amiibo could be used in, if any.
type: array type: array
items: items:
$ref: '#/components/schemas/AmiiboGame' $ref: '#/components/schemas/AmiiboGame'
gamesWiiU: gamesWiiU:
description: A list of Wii U games an Amiibo could be used in, if any. description: A list of Wii U games an amiibo could be used in, if any.
type: array type: array
items: items:
$ref: '#/components/schemas/AmiiboGame' $ref: '#/components/schemas/AmiiboGame'
head: head:
description: | description: |
The first 8 characters of the hexadecimal value that identifies an Amiibo. The first 8 characters of the hexadecimal value that identifies an amiibo.
The positions 0 to 7 of the hexadecimal string. The positions 0 to 7 of the hexadecimal string.
type: string type: string
pattern: "^[0-9a-fA-F]{8}$"
image: image:
description: An image URL related to an Amiibo. description: A URL pointing to an image of this amiibo.
type: string type: string
format: uri
name: name:
description: A name of an Amiibo. description: The name of this amiibo.
type: string type: string
release: release:
description: A type that contains the release dates of an Amiibo, if any. description: The regional release dates of this amiibo, if known.
$ref: '#/components/schemas/AmiiboRelease' $ref: '#/components/schemas/AmiiboRelease'
tail: tail:
description: | description: |
The last 8 characters of the hexadecimal value that identifies an Amiibo. The last 8 characters of the hexadecimal value that identifies an amiibo.
The positions 8 to 15 of the hexadecimal string. The positions 8 to 15 of the hexadecimal string.
type: string type: string
pattern: "^[0-9a-fA-F]{8}$"
type: type:
description: A name for the type an Amiibo belongs to. description: The type of this amiibo (e.g., Figure, Card, Yarn, Band).
type: string type: string
required: required:
- amiiboSeries - amiiboSeries
@@ -362,66 +404,126 @@ components:
- tail - tail
- type - type
AmiiboGame: AmiiboGame:
description: A type that represents a game in which an Amiibo is related to. description: A type that represents a game in which an amiibo can be used.
type: object type: object
properties: properties:
amiiboUsage: amiiboUsage:
description: A list of available usages an Amiibo have in a game, if any. description: A list of available usages an amiibo has in a game, if any.
type: array type: array
items: items:
$ref: '#/components/schemas/AmiiboUsage' $ref: '#/components/schemas/AmiiboUsage'
gameID: gameID:
description: A list of identifiers of a game an Amiibo is related to. description: A list of identifiers for the game.
type: array type: array
items: items:
type: string type: string
gameName: gameName:
description: A name of a game an Amiibo is related to. description: The name of the game.
type: string type: string
required: required:
- gameID - gameID
- gameName - gameName
AmiiboList:
description: A type that contains a list of `Amiibo` instances.
type: array
items:
description: A list if `Amiibo` instance.
$ref: '#/components/schemas/Amiibo'
AmiiboRelease: AmiiboRelease:
description: A type that contains the release dates of an Amiibo throughout the world. description: |
A type that contains the regional release dates of an amiibo.
Note: The service returns these dates as date-only strings (`yyyy-MM-dd`) without a time component, even though the properties declare the `date-time` format. The `date-time` format is kept deliberately so the generated code produces `Date` values, and the date-only strings are decoded by the custom transcoder configured in the live client, which interprets them as midnight UTC.
type: object type: object
properties: properties:
au: au:
description: A release date for Australia, if any. description: The release date in Australia, if known.
type: string type: string
format: date-time format: date-time
eu: eu:
description: A release date for Europe, if any. description: The release date in Europe, if known.
type: string type: string
format: date-time format: date-time
jp: jp:
description: A release date for Japan, if any. description: The release date in Japan, if known.
type: string type: string
format: date-time format: date-time
na: na:
description: A release date for North America, if any. description: The release date in North America, if known.
type: string type: string
format: date-time format: date-time
AmiiboSeries:
description: A type that represents an amiibo series.
type: object
properties:
key:
description: The hexadecimal key that uniquely identifies this amiibo series.
type: string
pattern: "^0x[0-9a-fA-F]+$"
minLength: 3
name:
description: The name of this amiibo series.
type: string
required:
- key
- name
AmiiboType:
description: A type that represents an amiibo type (e.g., Figure, Card, Yarn, Band).
type: object
properties:
key:
description: The hexadecimal key that uniquely identifies this amiibo type.
type: string
pattern: "^0x[0-9a-fA-F]+$"
minLength: 3
name:
description: The name of this amiibo type.
type: string
required:
- key
- name
AmiiboUsage: AmiiboUsage:
description: A type that represents a use of an Amiibo in a game. description: A type that represents how an amiibo is used within a game.
type: object type: object
properties: properties:
Usage: Usage:
description: An explanation of the usage of an Amiibo in a game. description: A description of how the amiibo is used within the game.
type: string type: string
write: write:
description: A flag that indicates whether the data in an Amiibo is writable or not. description: A flag that indicates whether the amiibo can save game data.
type: boolean type: boolean
required: required:
- Usage - Usage
- write - write
GameCharacter:
description: A type that represents a game character.
type: object
properties:
key:
description: The hexadecimal key that uniquely identifies this game character.
type: string
pattern: "^0x[0-9a-fA-F]+$"
minLength: 3
name:
description: The name of this game character.
type: string
required:
- key
- name
GameSeries:
description: A type that represents a game series.
type: object
properties:
key:
description: The hexadecimal key that uniquely identifies this game series.
type: string
pattern: "^0x[0-9a-fA-F]+$"
minLength: 3
name:
description: The name of this game series.
type: string
required:
- key
- name
LastUpdated: LastUpdated:
description: A type that informs when the data in the service was last updated. description: |
A type that contains the date and time when the service data was last updated.
Note: The service returns this timestamp in the `yyyy-MM-dd'T'HH:mm:ss.SSSSSS` format without a timezone offset, so it is not a strictly valid RFC 3339 `date-time` value. The `date-time` format is kept deliberately so the generated code produces a `Date` value, and the timestamp is decoded by the custom transcoder configured in the live client, which interprets it as UTC.
type: object type: object
properties: properties:
lastUpdated: lastUpdated:
@@ -430,48 +532,110 @@ components:
format: date-time format: date-time
required: required:
- lastUpdated - lastUpdated
# List Entities
AmiiboList:
description: A list that contains amiibos.
type: array
items:
$ref: '#/components/schemas/Amiibo'
AmiiboSeriesList:
description: A list that contains amiibo series.
type: array
items:
$ref: '#/components/schemas/AmiiboSeries'
AmiiboTypeList:
description: A list that contains amiibo types.
type: array
items:
$ref: '#/components/schemas/AmiiboType'
GameCharacterList:
description: A list that contains game characters.
type: array
items:
$ref: '#/components/schemas/GameCharacter'
GameSeriesList:
description: A list that contains game series.
type: array
items:
$ref: '#/components/schemas/GameSeries'
# Wrapper Entities # Wrapper Entities
AmiiboWrapper: AmiiboWrapper:
description: A type that contains either one or multiple `Amiibo` instances. description: |
A response wrapper that contains zero, one, or more amiibos.
Note: Unlike the other response wrappers, the `amiibo` property is deliberately not required: the service returns `"amiibo": null` when an `id` filter matches nothing, and an empty list when other filters match nothing. The property must therefore remain optional for decoding to succeed in both cases.
type: object type: object
properties: properties:
amiibo: amiibo:
description: A property that contains one or multiple `Amiibo` instances. description: A container that holds zero, one or more amiibos.
oneOf: oneOf:
- $ref: '#/components/schemas/Amiibo' - $ref: '#/components/schemas/Amiibo'
description: A certain amiibo.
- $ref: '#/components/schemas/AmiiboList' - $ref: '#/components/schemas/AmiiboList'
required: description: A list that contains amiibos.
- amiibo AmiiboSeriesWrapper:
Tuple: description: A response wrapper that contains one or more amiibo series.
description: |
A type that is conformed only by the `key` and `name` properties.
This type represents either `AmiiboSeries`, `AmiiboType`, `GameCharacter`, and `GameSeries` types.
type: object type: object
properties: properties:
key: amiibo:
description: A key assigned to a tuple. description: A container that holds one or more amiibo series.
type: string
name:
description: A name assigned to a tuple.
type: string
required:
- key
- name
TupleList:
description: A type that represents a list of key/value tuples.
type: array
items:
description: A property that can contains multiple `Tuple` instances.
$ref: '#/components/schemas/Tuple'
TupleWrapper:
description: A type that contains either one or multiple `Tuple` instances.
type: object
properties:
amiibo:
description: A property that contains one or multiple `Tuple` instances.
oneOf: oneOf:
- $ref: '#/components/schemas/Tuple' - $ref: '#/components/schemas/AmiiboSeries'
- $ref: '#/components/schemas/TupleList' description: A certain amiibo series.
required: - $ref: '#/components/schemas/AmiiboSeriesList'
description: A list that contains amiibo series.
required:
- amiibo
AmiiboTypeWrapper:
description: A response wrapper that contains one or more amiibo types.
type: object
properties:
amiibo:
description: A container that holds one or more amiibo types.
oneOf:
- $ref: '#/components/schemas/AmiiboType'
description: A certain amiibo type.
- $ref: '#/components/schemas/AmiiboTypeList'
description: A list that contains amiibo types.
required:
- amiibo - amiibo
GameCharacterWrapper:
description: A response wrapper that contains one or more game characters.
type: object
properties:
amiibo:
description: A container that holds one or more game characters.
oneOf:
- $ref: '#/components/schemas/GameCharacter'
description: A certain game character.
- $ref: '#/components/schemas/GameCharacterList'
description: A list that contains game characters.
required:
- amiibo
GameSeriesWrapper:
description: A response wrapper that contains one or more game series.
type: object
properties:
amiibo:
description: A container that holds one or more game series.
oneOf:
- $ref: '#/components/schemas/GameSeries'
description: A certain game series.
- $ref: '#/components/schemas/GameSeriesList'
description: A list that contains game series.
required:
- amiibo
# Error Entities
ServiceError:
description: A type that represents an error response from the service.
type: object
properties:
code:
description: The HTTP status code of the error.
type: integer
error:
description: A human-readable message describing the error.
type: string
required:
- code
- error
@@ -0,0 +1,78 @@
// ===----------------------------------------------------------------------===
//
// This source file is part of the Amiibo Service open source project
//
// Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0
//
// See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors
//
// SPDX-License-Identifier: Apache-2.0
//
// ===----------------------------------------------------------------------===
@testable import AmiiboService
import Foundation
import Testing
@Suite("ISO Date Time Transcoder")
struct ISODateTimeTranscoderTests {
// MARK: Properties
private let transcoder = ISODateTimeTranscoder()
// MARK: Decode tests
@Test
func `decodes a timestamp as UTC`() throws {
// GIVEN
let string = "2026-07-24T12:34:56.123000"
// WHEN
let date = try transcoder.decode(string)
// THEN
#expect(abs(date.timeIntervalSince(.utc(2026, 7, 24, 12, 34, 56)) - 0.123) < 0.001)
}
@Test
func `decodes a date-only string as midnight UTC`() throws {
// GIVEN
let string = "2014-11-21"
// WHEN
let date = try transcoder.decode(string)
// THEN
#expect(date == .utc(2014, 11, 21))
}
@Test(arguments: [
"", "2014-11", "2014-11-21T12:34:56", "2014-11-21T12:34:56Z", "21/11/2014", "yesterday"
])
func `throws a decoding error for an unsupported string`(string: String) {
// GIVEN
// WHEN
// THEN
#expect(throws: DecodingError.self) {
try transcoder.decode(string)
}
}
// MARK: Encode tests
@Test
func `encodes a date as a timestamp`() throws {
// GIVEN
let date: Date = .utc(2026, 7, 24, 12, 34, 56)
// WHEN
let string = try transcoder.encode(date)
// THEN
#expect(string == "2026-07-24T12:34:56.000000")
}
}
@@ -0,0 +1,480 @@
// ===----------------------------------------------------------------------===
//
// This source file is part of the Amiibo Service open source project
//
// Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0
//
// See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors
//
// SPDX-License-Identifier: Apache-2.0
//
// ===----------------------------------------------------------------------===
@testable import AmiiboService
import Foundation
import HTTPTypes
import Testing
@Suite("Amiibo Live Client")
struct AmiiboLiveClientTests {
// MARK: Server URL tests
@Test
func `resolves the server URL defined in the OpenAPI specification`() throws {
// GIVEN
// WHEN
let url = try Servers.Server1.url()
// THEN
#expect(url.absoluteString == "https://www.amiiboapi.org/api")
}
@Test
func `uses the server URL from the OpenAPI specification`() throws {
// GIVEN
let expected = try Servers.Server1.url()
// WHEN
let url = AmiiboLiveClient.serverURL
// THEN
#expect(url == expected)
}
// MARK: Error mapping tests
@Test(arguments: zip(
TransportErrors.thrown,
TransportErrors.expected
))
func `maps an error thrown by the transport to the matching service error`(
thrown: any Error,
expected: AmiiboServiceError
) async {
// GIVEN
let client = AmiiboLiveClient(transport: ThrowingTransport(error: thrown))
// WHEN
// THEN
await #expect(throws: expected) {
try await client.getAmiibos(by: .init())
}
}
@Test(arguments: zip(
Responses.failing,
Responses.expected
))
func `maps a response status to the matching service error`(
response: (status: Int, json: String?),
expected: AmiiboServiceError
) async {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport(
status: .init(code: response.status),
json: response.json
))
// WHEN
// THEN
await #expect(throws: expected) {
try await client.getAmiibos(by: .init())
}
}
// MARK: Get Amiibos tests
@Test
func `returns amiibos sorted by identifier`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport(status: .ok, json: JSON.amiibos))
// WHEN
let amiibos = try await client.getAmiibos(by: .init())
// THEN
#expect(amiibos.map(\.identifier) == ["0000000000000002", "0100000000040002"])
#expect(amiibos.map(\.name) == ["Mario", "Zelda"])
}
@Test
func `returns a single amiibo when the response holds an object`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport(status: .ok, json: JSON.amiibo))
// WHEN
let amiibos = try await client.getAmiibos(by: .init(identifier: "0100000000040002"))
let amiibo = try #require(amiibos.first)
// THEN
#expect(amiibos.count == 1)
#expect(amiibo.head == "01000000")
#expect(amiibo.tail == "00040002")
#expect(amiibo.name == "Zelda")
#expect(amiibo.type == "Figure")
#expect(amiibo.series == "Super Smash Bros.")
#expect(amiibo.gameCharacter == "Zelda")
#expect(amiibo.gameSeries == "The Legend of Zelda")
#expect(amiibo.imageURL?.host() == "example.com")
#expect(amiibo.platform == nil)
}
@Test
func `returns no amiibos when the response holds null`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport(status: .ok, json: JSON.amiibosNull))
// WHEN
let amiibos = try await client.getAmiibos(by: .init(identifier: "0000000000000000"))
// THEN
#expect(amiibos.isEmpty)
}
@Test
func `returns no amiibos when the response holds an empty list`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport(status: .ok, json: JSON.amiibosEmpty))
// WHEN
let amiibos = try await client.getAmiibos(by: .init(name: "Something"))
// THEN
#expect(amiibos.isEmpty)
}
@Test
func `decodes release dates as midnight UTC, and missing or null ones as nil`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport(status: .ok, json: JSON.amiibos))
// WHEN
let amiibos = try await client.getAmiibos(by: .init())
let mario = try #require(amiibos.first)
let zelda = try #require(amiibos.last)
// THEN
#expect(mario.release.america == .utc(2014, 11, 21))
#expect(mario.release.australia == .utc(2014, 11, 29))
#expect(mario.release.europe == .utc(2014, 11, 28))
#expect(mario.release.japan == .utc(2014, 12, 6))
#expect(zelda.release.australia == nil)
#expect(zelda.release.japan == nil)
}
@Test
func `maps related games and usages into the platform`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport(status: .ok, json: JSON.amiiboWithGames))
// WHEN
let amiibos = try await client.getAmiibos(by: .init(showUsage: true))
let platform = try #require(amiibos.first?.platform)
let game = try #require(platform.switch.first)
// THEN
#expect(platform.switch.count == 1)
#expect(platform.switch2.isEmpty)
#expect(platform.threeDS.isEmpty)
#expect(platform.wiiU.count == 1)
#expect(game.identifiers == ["01007EF00011E000"])
#expect(game.name == "The Legend of Zelda: Breath of the Wild")
#expect(game.usages == [.init(explanation: "Spawns a random selection of items.", isWriteable: false)])
#expect(platform.wiiU.first?.usages == nil)
}
@Test
func `encodes the amiibo filter as query parameters`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport { request in
let path = request.path ?? ""
#expect(path.hasPrefix("/amiibo?"))
#expect(path.contains("id=0100000000040002"))
#expect(path.contains("head=01000000"))
#expect(path.contains("tail=00040002"))
#expect(path.contains("name=zelda"))
#expect(path.contains("type=0x00"))
#expect(path.contains("amiiboSeries=0x00"))
#expect(path.contains("character=0x0100"))
#expect(path.contains("gameseries=0x010"))
#expect(path.contains("showgames=true"))
#expect(path.contains("showusage=false"))
return StubTransport.response(status: .ok, json: JSON.amiibosEmpty)
})
// WHEN
// THEN
_ = try await client.getAmiibos(by: .init(
head: "01000000",
tail: "00040002",
identifier: "0100000000040002",
name: "zelda",
type: "0x00",
series: "0x00",
gameCharacter: "0x0100",
gameSeries: "0x010",
showGames: true,
showUsage: false
))
}
@Test
func `omits nil filter values from the query`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport { request in
#expect(request.path == "/amiibo")
return StubTransport.response(status: .ok, json: JSON.amiibosEmpty)
})
// WHEN
// THEN
_ = try await client.getAmiibos(by: .init())
}
// MARK: Key-name endpoints tests
@Test
func `returns amiibo series sorted by key`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport(status: .ok, json: JSON.keyNameList))
// WHEN
let series = try await client.getAmiiboSeries(by: .init())
// THEN
#expect(series == [.init(key: "0x00", name: "Second"), .init(key: "0x01", name: "First")])
}
@Test
func `returns a single amiibo series when the response holds an object`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport { request in
#expect(request.path == "/amiiboseries?key=0x01")
return StubTransport.response(status: .ok, json: JSON.keyName)
})
// WHEN
let series = try await client.getAmiiboSeries(by: .init(key: "0x01"))
// THEN
#expect(series == [.init(key: "0x01", name: "First")])
}
@Test
func `returns amiibo types sorted by key`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport { request in
#expect(request.path == "/type")
return StubTransport.response(status: .ok, json: JSON.keyNameList)
})
// WHEN
let types = try await client.getAmiiboTypes(by: .init())
// THEN
#expect(types == [.init(key: "0x00", name: "Second"), .init(key: "0x01", name: "First")])
}
@Test
func `returns game characters sorted by key`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport { request in
#expect(request.path == "/character?name=First")
return StubTransport.response(status: .ok, json: JSON.keyNameList)
})
// WHEN
let characters = try await client.getGameCharacters(by: .init(name: "First"))
// THEN
#expect(characters == [.init(key: "0x00", name: "Second"), .init(key: "0x01", name: "First")])
}
@Test
func `returns game series sorted by key`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport { request in
#expect(request.path == "/gameseries")
return StubTransport.response(status: .ok, json: JSON.keyNameList)
})
// WHEN
let series = try await client.getGameSeries(by: .init())
// THEN
#expect(series == [.init(key: "0x00", name: "Second"), .init(key: "0x01", name: "First")])
}
@Test
func `throws notFound when a key-name endpoint matches nothing`() async {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport(status: .notFound, json: JSON.notFound))
// WHEN
// THEN
await #expect(throws: AmiiboServiceError.notFound) {
try await client.getGameSeries(by: .init(key: "0xffff"))
}
}
// MARK: Get Last Updated tests
@Test
func `returns the last updated timestamp as UTC`() async throws {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport { request in
#expect(request.path == "/lastupdated")
return StubTransport.response(status: .ok, json: JSON.lastUpdated)
})
// WHEN
let lastUpdated = try await client.getLastUpdated()
// THEN
#expect(lastUpdated == .utc(2026, 7, 24, 12, 34, 56))
}
@Test
func `throws notAvailable when the last updated endpoint fails`() async {
// GIVEN
let client = AmiiboLiveClient(transport: StubTransport(status: .internalServerError))
// WHEN
// THEN
await #expect(throws: AmiiboServiceError.notAvailable) {
try await client.getLastUpdated()
}
}
}
// MARK: - Arguments
private enum TransportErrors {
/// Errors thrown by the transport.
static let thrown: [any Error] = [
CancellationError(),
URLError(.cancelled),
URLError(.cannotParseResponse),
URLError(.notConnectedToInternet),
URLError(.timedOut),
URLError(.badURL)
]
/// The service error expected for each thrown error.
static let expected: [AmiiboServiceError] = [
.cancelled,
.cancelled,
.decoding,
.notAvailable,
.notAvailable,
.unknown(String(describing: URLError(.badURL)))
]
}
private enum Responses {
/// Failing responses, with a body where the specification documents one.
static let failing: [(status: Int, json: String?)] = [
(400, JSON.badRequest),
(404, JSON.notFound),
(500, nil),
(418, nil),
(200, "not json")
]
/// The service error expected for each failing response.
static let expected: [AmiiboServiceError] = [
.badRequest,
.notFound,
.notAvailable,
.undocumented(418),
.decoding
]
}
// MARK: - Payloads
private enum JSON {
/// Two amiibos in reverse identifier order; the first lacks `au` and has a null `jp`.
static let amiibos = """
{"amiibo": [
{
"amiiboSeries": "Super Smash Bros.", "character": "Zelda", "gameSeries": "The Legend of Zelda",
"head": "01000000", "tail": "00040002", "name": "Zelda", "type": "Figure",
"image": "https://example.com/zelda.png",
"release": {"eu": "2014-11-28", "jp": null, "na": "2014-11-21"}
},
{
"amiiboSeries": "Super Smash Bros.", "character": "Mario", "gameSeries": "Super Mario",
"head": "00000000", "tail": "00000002", "name": "Mario", "type": "Figure",
"image": "https://example.com/mario.png",
"release": {"au": "2014-11-29", "eu": "2014-11-28", "jp": "2014-12-06", "na": "2014-11-21"}
}
]}
"""
/// A single amiibo, as returned for an `id` filter.
static let amiibo = """
{"amiibo": {
"amiiboSeries": "Super Smash Bros.", "character": "Zelda", "gameSeries": "The Legend of Zelda",
"head": "01000000", "tail": "00040002", "name": "Zelda", "type": "Figure",
"image": "https://example.com/zelda.png",
"release": {"au": "2014-12-04", "eu": "2014-11-28", "jp": "2014-12-06", "na": "2014-11-21"}
}}
"""
/// An amiibo with Switch and Wii U games, an empty 3DS list, and no Switch 2 key.
static let amiiboWithGames = """
{"amiibo": [{
"amiiboSeries": "Super Smash Bros.", "character": "Zelda", "gameSeries": "The Legend of Zelda",
"head": "01000000", "tail": "00040002", "name": "Zelda", "type": "Figure",
"image": "https://example.com/zelda.png",
"release": {"na": "2014-11-21"},
"games3DS": [],
"gamesSwitch": [{
"gameID": ["01007EF00011E000"],
"gameName": "The Legend of Zelda: Breath of the Wild",
"amiiboUsage": [{"Usage": "Spawns a random selection of items.", "write": false}]
}],
"gamesWiiU": [{
"gameID": ["0005000010145000"],
"gameName": "Super Smash Bros. for Wii U"
}]
}]}
"""
/// The response for an `id` filter that matches nothing.
static let amiibosNull = """
{"amiibo": null}
"""
/// The response for any other filter that matches nothing.
static let amiibosEmpty = """
{"amiibo": []}
"""
/// Two key-name items in reverse key order.
static let keyNameList = """
{"amiibo": [{"key": "0x01", "name": "First"}, {"key": "0x00", "name": "Second"}]}
"""
/// A single key-name item, as returned for a `key` filter.
static let keyName = """
{"amiibo": {"key": "0x01", "name": "First"}}
"""
/// The last updated timestamp.
static let lastUpdated = """
{"lastUpdated": "2026-07-24T12:34:56.000000"}
"""
/// The body of a 400 response.
static let badRequest = """
{"code": 400, "error": "Bad request."}
"""
/// The body of a 404 response.
static let notFound = """
{"code": 404, "error": "Not found."}
"""
}
@@ -0,0 +1,61 @@
// ===----------------------------------------------------------------------===
//
// This source file is part of the Amiibo Service open source project
//
// Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0
//
// See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors
//
// SPDX-License-Identifier: Apache-2.0
//
// ===----------------------------------------------------------------------===
import AmiiboService
import Testing
@Suite("Filter conformances")
struct FilterConformanceTests {
// MARK: Equatable tests
@Test
func `compares amiibo filters by value`() {
// GIVEN
// WHEN
// THEN
#expect(AmiiboFilter() == AmiiboFilter())
#expect(AmiiboFilter(name: "zelda") == AmiiboFilter(name: "zelda"))
#expect(AmiiboFilter(name: "zelda") != AmiiboFilter(name: "mario"))
#expect(AmiiboFilter() != AmiiboFilter(showGames: true))
}
@Test
func `compares key-name filters by value`() {
// GIVEN
// WHEN
// THEN
#expect(AmiiboSeriesFilter() == AmiiboSeriesFilter())
#expect(AmiiboSeriesFilter(key: "0x01") == AmiiboSeriesFilter(key: "0x01"))
#expect(AmiiboSeriesFilter(key: "0x01") != AmiiboSeriesFilter(name: "0x01"))
#expect(AmiiboTypeFilter(name: "Card") != AmiiboTypeFilter(name: "Figure"))
#expect(GameCharacterFilter(key: "0x0100") != GameCharacterFilter())
#expect(GameSeriesFilter(name: "Pikmin") == GameSeriesFilter(name: "Pikmin"))
}
// MARK: Hashable tests
@Test
func `hashes equal filters alike`() {
// GIVEN
let amiiboFilters: Set = [AmiiboFilter(name: "zelda"), AmiiboFilter(name: "zelda"), AmiiboFilter(name: "mario")]
let seriesFilters: Set = [AmiiboSeriesFilter(key: "0x01"), AmiiboSeriesFilter(key: "0x01"), AmiiboSeriesFilter()]
// WHEN
// THEN
#expect(amiiboFilters.count == 2)
#expect(seriesFilters.count == 2)
}
}
@@ -0,0 +1,84 @@
// ===----------------------------------------------------------------------===
//
// This source file is part of the Amiibo Service open source project
//
// Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0
//
// See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors
//
// SPDX-License-Identifier: Apache-2.0
//
// ===----------------------------------------------------------------------===
import AmiiboService
import Foundation
import Testing
@Suite("Model conformances")
struct ModelConformanceTests {
// MARK: Identifiable tests
@Test
func `identifies an amiibo by its identifier`() {
// GIVEN
let amiibos = Fixtures.amiibos
// WHEN
// THEN
#expect(amiibos.map(\.id) == amiibos.map(\.identifier))
}
@Test
func `identifies key-name models by their keys`() {
// GIVEN
// WHEN
// THEN
#expect(Fixtures.amiiboSeries.map(\.id) == Fixtures.amiiboSeries.map(\.key))
#expect(Fixtures.amiiboTypes.map(\.id) == Fixtures.amiiboTypes.map(\.key))
#expect(Fixtures.gameCharacters.map(\.id) == Fixtures.gameCharacters.map(\.key))
#expect(Fixtures.gameSeries.map(\.id) == Fixtures.gameSeries.map(\.key))
}
// MARK: Codable tests
@Test
func `round-trips amiibos through JSON`() throws {
// GIVEN
let amiibos = Fixtures.amiibos
// WHEN
let decoded = try roundTrip(amiibos)
// THEN
#expect(decoded == amiibos)
#expect(decoded.first?.platform?.switch.first?.usages?.isEmpty == false)
}
@Test
func `round-trips key-name models through JSON`() throws {
// GIVEN
// WHEN
// THEN
#expect(try roundTrip(Fixtures.amiiboSeries) == Fixtures.amiiboSeries)
#expect(try roundTrip(Fixtures.amiiboTypes) == Fixtures.amiiboTypes)
#expect(try roundTrip(Fixtures.gameCharacters) == Fixtures.gameCharacters)
#expect(try roundTrip(Fixtures.gameSeries) == Fixtures.gameSeries)
}
}
// MARK: - Helpers
private extension ModelConformanceTests {
// MARK: Functions
/// Encodes a value to JSON and decodes it back.
func roundTrip<Value: Codable>(_ value: Value) throws -> Value {
try JSONDecoder().decode(Value.self, from: JSONEncoder().encode(value))
}
}
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -16,7 +16,14 @@ import AmiiboService
import Foundation import Foundation
import Testing import Testing
@Suite("Amiibo Service", .tags(.live)) @Suite(
"Amiibo Service",
.tags(.live),
.enabled(
if: ProcessInfo.processInfo.environment["AMIIBO_LIVE_TESTS"] == "1",
"Set the 'AMIIBO_LIVE_TESTS' environment variable to '1' to run these tests against the live service."
)
)
struct AmiiboServiceLiveTests { struct AmiiboServiceLiveTests {
// MARK: Properties // MARK: Properties
@@ -31,18 +38,17 @@ struct AmiiboServiceLiveTests {
// MARK: Functions tests // MARK: Functions tests
#if swift(>=6.2)
@Test(arguments: zip( @Test(arguments: zip(
Input.amiibos, Input.amiibos,
Output.amiibos Output.amiibos
)) ))
func `get amiibos`( func `get amiibos`(
filter: AmiiboFilter, filter: AmiiboFilter,
expects numberOfItems: Int expects count: ExpectedCount
) async throws { ) async throws {
try await assertAmiibos( try await assertAmiibos(
with: filter, with: filter,
expects: numberOfItems expects: count
) )
} }
@@ -66,11 +72,11 @@ struct AmiiboServiceLiveTests {
)) ))
func `get amiibo series`( func `get amiibo series`(
filter: AmiiboSeriesFilter, filter: AmiiboSeriesFilter,
expects numberOfItems: Int expects count: ExpectedCount
) async throws { ) async throws {
try await assertAmiiboSeries( try await assertAmiiboSeries(
with: filter, with: filter,
expects: numberOfItems expects: count
) )
} }
@@ -94,11 +100,11 @@ struct AmiiboServiceLiveTests {
)) ))
func `get amiibo types`( func `get amiibo types`(
filter: AmiiboTypeFilter, filter: AmiiboTypeFilter,
expects numberOfItems: Int expects count: ExpectedCount
) async throws { ) async throws {
try await assertAmiiboTypes( try await assertAmiiboTypes(
with: filter, with: filter,
expects: numberOfItems expects: count
) )
} }
@@ -122,11 +128,11 @@ struct AmiiboServiceLiveTests {
)) ))
func `get game characters`( func `get game characters`(
filter: GameCharacterFilter, filter: GameCharacterFilter,
expects numberOfItems: Int expects count: ExpectedCount
) async throws { ) async throws {
try await assertGameCharacters( try await assertGameCharacters(
with: filter, with: filter,
expects: numberOfItems expects: count
) )
} }
@@ -150,11 +156,11 @@ struct AmiiboServiceLiveTests {
)) ))
func `get game series`( func `get game series`(
filter: GameSeriesFilter, filter: GameSeriesFilter,
expects numberOfItems: Int expects count: ExpectedCount
) async throws { ) async throws {
try await assertGameSeries( try await assertGameSeries(
with: filter, with: filter,
expects: numberOfItems expects: count
) )
} }
@@ -175,161 +181,11 @@ struct AmiiboServiceLiveTests {
@Test @Test
func `get the last updated timestamp`() async throws { func `get the last updated timestamp`() async throws {
try await assertLastUpdated( try await assertLastUpdated(
day: 21, onOrAfterDay: 22,
month: 9, month: 10,
year: 2025 year: 2026
) )
} }
#else
@Test("get amiibos", arguments: zip(
Input.amiibos,
Output.amiibos
))
func getAmiibos(
filter: AmiiboFilter,
expects numberOfItems: Int
) async throws {
try await assertAmiibos(
with: filter,
expects: numberOfItems
)
}
@Test("get amiibos throws", arguments: zip(
Input.amiibosThrows,
Output.amiibosThrows
))
func getAmiibosThrows(
filter: AmiiboFilter,
expects error: AmiiboServiceError
) async throws {
try await assertsAmiibosThrows(
error: error,
when: filter
)
}
@Test("get amiibo series", arguments: zip(
Input.amiiboSeries,
Output.amiiboSeries
))
func getAmiiboSeries(
filter: AmiiboSeriesFilter,
expects numberOfItems: Int
) async throws {
try await assertAmiiboSeries(
with: filter,
expects: numberOfItems
)
}
@Test("get amiibo series throws", arguments: zip(
Input.amiiboSeriesThrows,
Output.amiiboSeriesThrows
))
func getAmiiboSeriesThrows(
filter: AmiiboSeriesFilter,
expects error: AmiiboServiceError
) async throws {
try await assertsAmiiboSeriesThrows(
error: error,
when: filter
)
}
@Test("get amiibo types", arguments: zip(
Input.amiiboTypes,
Output.amiiboTypes
))
func getAmiiboTypes(
filter: AmiiboTypeFilter,
expects numberOfItems: Int
) async throws {
try await assertAmiiboTypes(
with: filter,
expects: numberOfItems
)
}
@Test("get amiibo types throws", arguments: zip(
Input.amiiboTypesThrows,
Output.amiiboTypesThrows
))
func getAmiiboTypesThrows(
filter: AmiiboTypeFilter,
expects error: AmiiboServiceError
) async throws {
try await assertsAmiiboTypesThrows(
error: error,
when: filter
)
}
@Test("get game characters", arguments: zip(
Input.gameCharacters,
Output.gameCharacters
))
func getGameCharacters(
filter: GameCharacterFilter,
expects numberOfItems: Int
) async throws {
try await assertGameCharacters(
with: filter,
expects: numberOfItems
)
}
@Test("get game characters throws", arguments: zip(
Input.gameCharactersThrows,
Output.gameCharactersThrows
))
func getGameCharactersThrows(
filter: GameCharacterFilter,
expects error: AmiiboServiceError
) async throws {
try await assertsGameCharactersThrows(
error: error,
when: filter
)
}
@Test("get game series", arguments: zip(
Input.gameSeries,
Output.gameSeries
))
func getGameSeries(
filter: GameSeriesFilter,
expects numberOfItems: Int
) async throws {
try await assertGameSeries(
with: filter,
expects: numberOfItems
)
}
@Test("get game series throws", arguments: zip(
Input.gameSeriesThrows,
Output.gameSeriesThrows
))
func getGameSeriesThrows(
filter: GameSeriesFilter,
expects error: AmiiboServiceError
) async throws {
try await assertsGameSeriesThrows(
error: error,
when: filter
)
}
@Test("get last updated timestamp")
func getLastUpdated() async throws {
try await assertLastUpdated(
day: 21,
month: 9,
year: 2025
)
}
#endif
} }
@@ -342,17 +198,17 @@ private extension AmiiboServiceLiveTests {
/// Asserts the number of items returned by the `amiibos` endpoint that matched a given filter. /// Asserts the number of items returned by the `amiibos` endpoint that matched a given filter.
/// - Parameters: /// - Parameters:
/// - filter: An amiibo filter type. /// - filter: An amiibo filter type.
/// - numberOfItems: An expected number of items returned. /// - count: An expected count of items to be returned.
func assertAmiibos( func assertAmiibos(
with filter: AmiiboFilter, with filter: AmiiboFilter,
expects numberOfItems: Int expects count: ExpectedCount
) async throws { ) async throws {
// GIVEN // GIVEN
// WHEN // WHEN
let amiibos = try await service.getAmiibos(filter) let amiibos = try await service.getAmiibos(filter)
// THEN // THEN
#expect(amiibos.count == numberOfItems) assert(amiibos.count, matches: count)
guard guard
!amiibos.isEmpty, !amiibos.isEmpty,
@@ -365,6 +221,7 @@ private extension AmiiboServiceLiveTests {
if filter.showUsage == true { if filter.showUsage == true {
#expect(firstAmiiboPlatform.switch.first?.usages?.isEmpty == false) #expect(firstAmiiboPlatform.switch.first?.usages?.isEmpty == false)
#expect(firstAmiiboPlatform.switch2.first?.usages?.isEmpty == false)
#expect(firstAmiiboPlatform.threeDS.first?.usages?.isEmpty == false) #expect(firstAmiiboPlatform.threeDS.first?.usages?.isEmpty == false)
#expect(firstAmiiboPlatform.wiiU.first?.usages?.isEmpty == false) #expect(firstAmiiboPlatform.wiiU.first?.usages?.isEmpty == false)
} }
@@ -389,17 +246,17 @@ private extension AmiiboServiceLiveTests {
/// Asserts the number of items returned by the `amiiboSeries` endpoint that matched a given filter. /// Asserts the number of items returned by the `amiiboSeries` endpoint that matched a given filter.
/// - Parameters: /// - Parameters:
/// - filter: An amiibo series filter type. /// - filter: An amiibo series filter type.
/// - numberOfItems: An expected number of items returned. /// - count: An expected count of items to be returned.
func assertAmiiboSeries( func assertAmiiboSeries(
with filter: AmiiboSeriesFilter, with filter: AmiiboSeriesFilter,
expects numberOfItems: Int expects count: ExpectedCount
) async throws { ) async throws {
// GIVEN // GIVEN
// WHEN // WHEN
let amiiboSeries = try await service.getAmiiboSeries(filter) let amiiboSeries = try await service.getAmiiboSeries(filter)
// THEN // THEN
#expect(amiiboSeries.count == numberOfItems) assert(amiiboSeries.count, matches: count)
} }
/// Asserts the error thrown by the `amiiboSeries` endpoint. /// Asserts the error thrown by the `amiiboSeries` endpoint.
@@ -421,17 +278,17 @@ private extension AmiiboServiceLiveTests {
/// Asserts the number of items returned by the `amiiboTypes` endpoint that matched a given filter. /// Asserts the number of items returned by the `amiiboTypes` endpoint that matched a given filter.
/// - Parameters: /// - Parameters:
/// - filter: An amiibo type filter type. /// - filter: An amiibo type filter type.
/// - numberOfItems: An expected number of items returned. /// - count: An expected count of items to be returned.
func assertAmiiboTypes( func assertAmiiboTypes(
with filter: AmiiboTypeFilter, with filter: AmiiboTypeFilter,
expects numberOfItems: Int expects count: ExpectedCount
) async throws { ) async throws {
// GIVEN // GIVEN
// WHEN // WHEN
let amiiboTypes = try await service.getAmiiboTypes(filter) let amiiboTypes = try await service.getAmiiboTypes(filter)
// THEN // THEN
#expect(amiiboTypes.count == numberOfItems) assert(amiiboTypes.count, matches: count)
} }
/// Asserts the error thrown by the `amiiboTypes` endpoint. /// Asserts the error thrown by the `amiiboTypes` endpoint.
@@ -453,17 +310,17 @@ private extension AmiiboServiceLiveTests {
/// Asserts the number of items returned by the `gameCharacters` endpoint that matched a given filter. /// Asserts the number of items returned by the `gameCharacters` endpoint that matched a given filter.
/// - Parameters: /// - Parameters:
/// - filter: A game character filter type. /// - filter: A game character filter type.
/// - numberOfItems: An expected number of items returned. /// - count: An expected count of items to be returned.
func assertGameCharacters( func assertGameCharacters(
with filter: GameCharacterFilter, with filter: GameCharacterFilter,
expects numberOfItems: Int expects count: ExpectedCount
) async throws { ) async throws {
// GIVEN // GIVEN
// WHEN // WHEN
let gameCharacters = try await service.getGameCharacters(filter) let gameCharacters = try await service.getGameCharacters(filter)
// THEN // THEN
#expect(gameCharacters.count == numberOfItems) assert(gameCharacters.count, matches: count)
} }
/// Asserts the error thrown by the `gameCharacters` endpoint. /// Asserts the error thrown by the `gameCharacters` endpoint.
@@ -485,17 +342,17 @@ private extension AmiiboServiceLiveTests {
/// Asserts the number of items returned by the `gameSeries` endpoint that matched a given filter. /// Asserts the number of items returned by the `gameSeries` endpoint that matched a given filter.
/// - Parameters: /// - Parameters:
/// - filter: A game series filter type. /// - filter: A game series filter type.
/// - numberOfItems: An expected number of items returned. /// - count: An expected count of items to be returned.
func assertGameSeries( func assertGameSeries(
with filter: GameSeriesFilter, with filter: GameSeriesFilter,
expects numberOfItems: Int expects count: ExpectedCount
) async throws { ) async throws {
// GIVEN // GIVEN
// WHEN // WHEN
let gameSeries = try await service.getGameSeries(filter) let gameSeries = try await service.getGameSeries(filter)
// THEN // THEN
#expect(gameSeries.count == numberOfItems) assert(gameSeries.count, matches: count)
} }
/// Asserts the error thrown by the `gameSeries` endpoint. /// Asserts the error thrown by the `gameSeries` endpoint.
@@ -514,31 +371,61 @@ private extension AmiiboServiceLiveTests {
} }
} }
/// Asserts the date returned by the `lastUpdated` endpoint. /// Asserts the date returned by the `lastUpdated` endpoint is within a plausible range.
///
/// The live service updates its data over time, so this assertion checks the returned date is not before the last known update and not in the future, instead of matching an exact date that would break on every update.
///
/// - Parameters: /// - Parameters:
/// - day: A number of day of the last updated date. /// - day: A number of day of the earliest expected last updated date.
/// - month: A number of month of the last updated date. /// - month: A number of month of the earliest expected last updated date.
/// - year: A number of year of the last updated date. /// - year: A number of year of the earliest expected last updated date.
func assertLastUpdated( func assertLastUpdated(
day: Int, onOrAfterDay day: Int,
month: Int, month: Int,
year: Int year: Int
) async throws { ) async throws {
// GIVEN // GIVEN
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = try #require(TimeZone(secondsFromGMT: 0))
let earliest = try #require(calendar.date(from: .init(
year: year,
month: month,
day: day
)))
// WHEN // WHEN
let dateLastUpdated = try await service.getLastUpdated() let dateLastUpdated = try await service.getLastUpdated()
// THEN // THEN
let dateComponents = Calendar.current.dateComponents( #expect(dateLastUpdated >= earliest)
[.year, .month, .day], #expect(dateLastUpdated <= .now)
from: dateLastUpdated
)
#expect(dateComponents.year == year)
#expect(dateComponents.month == month)
#expect(dateComponents.day == day)
} }
/// Asserts an actual number of items matches an expected count.
/// - Parameters:
/// - actualCount: A number of items returned by an endpoint.
/// - expectation: An expected count to match the number of items against.
func assert(_ actualCount: Int, matches expectation: ExpectedCount) {
switch expectation {
case let .exactly(expected):
#expect(actualCount == expected)
case let .atLeast(minimum):
#expect(actualCount >= minimum)
}
}
}
// MARK: - Expectations
/// An expectation about the number of items returned by an endpoint of the live service.
enum ExpectedCount {
/// The endpoint is expected to return exactly the associated number of items.
case exactly(Int)
/// The endpoint is expected to return at least the associated number of items, as the data at the live service grows over time.
case atLeast(Int)
} }
// MARK: - Arguments // MARK: - Arguments
@@ -552,6 +439,8 @@ enum Input {
.init(tail: "00000002"), .init(tail: "00000002"),
.init(tail: "0002"), .init(tail: "0002"),
.init(identifier: "0000000000000002"), .init(identifier: "0000000000000002"),
.init(identifier: "0000000000000000"),
.init(identifier: "0000000"),
.init(name: "zelda"), .init(name: "zelda"),
.init(name: "Something"), .init(name: "Something"),
.init(name: "zel"), .init(name: "zel"),
@@ -587,8 +476,6 @@ enum Input {
static let amiibosThrows: [AmiiboFilter] = [ static let amiibosThrows: [AmiiboFilter] = [
.init(head: .empty), .init(head: .empty),
.init(tail: .empty), .init(tail: .empty),
.init(identifier: "0000000000000000"),
.init(identifier: "0000000"),
.init(identifier: .empty), .init(identifier: .empty),
.init(type: "0x"), .init(type: "0x"),
.init(series: "0x"), .init(series: "0x"),
@@ -658,24 +545,37 @@ enum Input {
} }
enum Output { enum Output {
/// A list of number of items that are expected from the `assertAmiibos` assertion. /// A list of expected counts from the `assertAmiibos` assertion.
static let amiibos: [Int] = [.totalAmiibos, 7, 7, 1, 1, 1, 5, .zero, 7, .totalAmiibos, 235, 235, .zero, .zero, .zero, .zero, 96, 26, .zero, .zero, 25, .totalAmiibos, 12, 6, .zero, .zero, .zero, .totalAmiibos, 49, 32, .zero, .zero, 147, .totalAmiibos, .totalAmiibos, .totalAmiibos] ///
/// Counts for filters that match a growing set of items are expressed as `atLeast` minimums, so the tests do not break whenever new amiibo items are added to the live service.
static let amiibos: [ExpectedCount] = [
.atLeast(.minimumAmiibos),
.atLeast(7), .atLeast(7),
.exactly(1), .atLeast(1),
.exactly(1), .exactly(.zero), .exactly(.zero),
.atLeast(5), .exactly(.zero), .atLeast(7), .atLeast(.minimumAmiibos),
.atLeast(254), .atLeast(254), .exactly(.zero), .exactly(.zero), .exactly(.zero), .exactly(.zero),
.atLeast(96), .atLeast(26), .exactly(.zero), .exactly(.zero), .atLeast(63), .atLeast(.minimumAmiibos),
.atLeast(14), .atLeast(6), .exactly(.zero), .exactly(.zero), .exactly(.zero), .atLeast(.minimumAmiibos),
.atLeast(53), .atLeast(32), .exactly(.zero), .exactly(.zero), .atLeast(152), .atLeast(.minimumAmiibos),
.atLeast(.minimumAmiibos), .atLeast(.minimumAmiibos)
]
/// A list of errors are expected to be thrown from the `assertAmiibosThrows` assertion. /// A list of errors are expected to be thrown from the `assertAmiibosThrows` assertion.
static let amiibosThrows: [AmiiboServiceError] = [.badRequest, .badRequest, .decoding, .decoding, .badRequest, .badRequest, .badRequest, .badRequest, .badRequest] static let amiibosThrows: [AmiiboServiceError] = [.badRequest, .badRequest, .badRequest, .badRequest, .badRequest, .badRequest, .badRequest]
/// A list of number of items that are expected from the `assertAmiiboSeries` assertion. /// A list of expected counts from the `assertAmiiboSeries` assertion.
static let amiiboSeries: [Int] = [.totalAmiiboSeries, 1, 1, 1, .totalAmiiboSeries] static let amiiboSeries: [ExpectedCount] = [.atLeast(.minimumAmiiboSeries), .exactly(1), .exactly(1), .exactly(1), .atLeast(.minimumAmiiboSeries)]
/// A list of errors are expected to be thrown from the `assertAmiiboSeriesThrows` assertion. /// A list of errors are expected to be thrown from the `assertAmiiboSeriesThrows` assertion.
static let amiiboSeriesThrows: [AmiiboServiceError] = [.notFound, .badRequest, .badRequest, .notFound] static let amiiboSeriesThrows: [AmiiboServiceError] = [.notFound, .badRequest, .badRequest, .notFound]
/// A list of number of items that are expected from the `assertAmiiboTypes` assertion. /// A list of expected counts from the `assertAmiiboTypes` assertion.
static let amiiboTypes: [Int] = [.totalAmiiboTypes, 1, 1, 1, .totalAmiiboTypes] static let amiiboTypes: [ExpectedCount] = [.atLeast(.minimumAmiiboTypes), .exactly(1), .exactly(1), .exactly(1), .atLeast(.minimumAmiiboTypes)]
/// A list of errors are expected to be thrown from the `assertAmiiboTypesThrows` assertion. /// A list of errors are expected to be thrown from the `assertAmiiboTypesThrows` assertion.
static let amiiboTypesThrows: [AmiiboServiceError] = [.notFound, .badRequest, .badRequest, .notFound] static let amiiboTypesThrows: [AmiiboServiceError] = [.notFound, .badRequest, .badRequest, .notFound]
/// A list of number of items that are expected from the `assertGameCharacters` assertion. /// A list of expected counts from the `assertGameCharacters` assertion.
static let gameCharacters: [Int] = [.totalGameCharacters, 1, 1, 1, .totalGameCharacters] static let gameCharacters: [ExpectedCount] = [.atLeast(.minimumGameCharacters), .exactly(1), .exactly(1), .exactly(1), .atLeast(.minimumGameCharacters)]
/// A list of errors are expected to be thrown from the `assertGameCharactersThrows` assertion. /// A list of errors are expected to be thrown from the `assertGameCharactersThrows` assertion.
static let gameCharactersThrows: [AmiiboServiceError] = [.notFound, .badRequest, .badRequest, .notFound] static let gameCharactersThrows: [AmiiboServiceError] = [.notFound, .badRequest, .badRequest, .notFound]
/// A list of number of items that are expected from the `assertGameSeries` assertion. /// A list of expected counts from the `assertGameSeries` assertion.
static let gameSeries: [Int] = [.totalGameSeries, 1, 1, 1, .totalGameSeries] static let gameSeries: [ExpectedCount] = [.atLeast(.minimumGameSeries), .exactly(1), .exactly(1), .exactly(1), .atLeast(.minimumGameSeries)]
/// A list of errors are expected to be thrown from the `assertGameSeriesThrows` assertion. /// A list of errors are expected to be thrown from the `assertGameSeriesThrows` assertion.
static let gameSeriesThrows: [AmiiboServiceError] = [.notFound, .badRequest, .badRequest, .notFound] static let gameSeriesThrows: [AmiiboServiceError] = [.notFound, .badRequest, .badRequest, .notFound]
} }
@@ -683,16 +583,16 @@ enum Output {
// MARK: - Constants // MARK: - Constants
private extension Int { private extension Int {
/// A number that represents the total number of amiibo items currently available at the live service. /// A number that represents the minimum number of amiibo items expected from the live service, as of October 2026.
static let totalAmiibos = 889 static let minimumAmiibos = 952
/// A number that represents the total number of amiibo series currently available at the live service. /// A number that represents the minimum number of amiibo series expected from the live service, as of October 2026.
static let totalAmiiboSeries = 29 static let minimumAmiiboSeries = 32
/// A number that represents the total number of amiibo types currently available at the live service. /// A number that represents the minimum number of amiibo types expected from the live service, as of October 2026.
static let totalAmiiboTypes = 5 static let minimumAmiiboTypes = 5
/// A number that represents the total number of game characters currently available at the live service. /// A number that represents the minimum number of game characters expected from the live service, as of October 2026.
static let totalGameCharacters = 668 static let minimumGameCharacters = 685
/// A number that represents the total number of game series currently available at the live service. /// A number that represents the minimum number of game series expected from the live service, as of October 2026.
static let totalGameSeries = 117 static let minimumGameSeries = 119
} }
private extension String { private extension String {
@@ -0,0 +1,328 @@
// ===----------------------------------------------------------------------===
//
// This source file is part of the Amiibo Service open source project
//
// Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0
//
// See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors
//
// SPDX-License-Identifier: Apache-2.0
//
// ===----------------------------------------------------------------------===
import AmiiboService
import Foundation
import Testing
@Suite("Amiibo Service [Mock]", .tags(.mock))
struct AmiiboServiceMockTests {
// MARK: Get Amiibos tests
@Test
func `returns empty amiibos when mock provides an empty list`() async throws {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(amiibos: []))
// WHEN
let amiibos = try await service.getAmiibos()
// THEN
#expect(amiibos.isEmpty)
}
@Test
func `returns amiibos when mock provides a list`() async throws {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(amiibos: Fixtures.amiibos))
// WHEN
let amiibos = try await service.getAmiibos()
// THEN
#expect(amiibos == Fixtures.amiibos)
#expect(amiibos.first?.identifier == "0100000000040002")
#expect(amiibos.first?.imageURL != nil)
}
@Test
func `throws notFound when mock provides no amiibos`() async {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient())
// WHEN
// THEN
await #expect(throws: AmiiboServiceError.notFound) {
try await service.getAmiibos()
}
}
@Test(arguments: Errors.all)
func `throws error for amiibos when mock is configured with error`(error: AmiiboServiceError) async {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(error: error))
// WHEN
// THEN
await #expect(throws: error) {
try await service.getAmiibos()
}
}
// MARK: Get Amiibo Series tests
@Test
func `returns empty amiibo series when mock provides an empty list`() async throws {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(amiiboSeries: []))
// WHEN
let amiiboSeries = try await service.getAmiiboSeries()
// THEN
#expect(amiiboSeries.isEmpty)
}
@Test
func `returns amiibo series when mock provides a list`() async throws {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(amiiboSeries: Fixtures.amiiboSeries))
// WHEN
let amiiboSeries = try await service.getAmiiboSeries()
// THEN
#expect(amiiboSeries == Fixtures.amiiboSeries)
}
@Test
func `throws notFound when mock provides no amiibo series`() async {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient())
// WHEN
// THEN
await #expect(throws: AmiiboServiceError.notFound) {
try await service.getAmiiboSeries()
}
}
@Test(arguments: Errors.all)
func `throws error for amiibo series when mock is configured with error`(error: AmiiboServiceError) async {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(error: error))
// WHEN
// THEN
await #expect(throws: error) {
try await service.getAmiiboSeries()
}
}
// MARK: Get Amiibo Types tests
@Test
func `returns empty amiibo types when mock provides an empty list`() async throws {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(amiiboTypes: []))
// WHEN
let amiiboTypes = try await service.getAmiiboTypes()
// THEN
#expect(amiiboTypes.isEmpty)
}
@Test
func `returns amiibo types when mock provides a list`() async throws {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(amiiboTypes: Fixtures.amiiboTypes))
// WHEN
let amiiboTypes = try await service.getAmiiboTypes()
// THEN
#expect(amiiboTypes == Fixtures.amiiboTypes)
}
@Test
func `throws notFound when mock provides no amiibo types`() async {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient())
// WHEN
// THEN
await #expect(throws: AmiiboServiceError.notFound) {
try await service.getAmiiboTypes()
}
}
@Test(arguments: Errors.all)
func `throws error for amiibo types when mock is configured with error`(error: AmiiboServiceError) async {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(error: error))
// WHEN
// THEN
await #expect(throws: error) {
try await service.getAmiiboTypes()
}
}
// MARK: Get Game Characters tests
@Test
func `returns empty game characters when mock provides an empty list`() async throws {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(gameCharacters: []))
// WHEN
let gameCharacters = try await service.getGameCharacters()
// THEN
#expect(gameCharacters.isEmpty)
}
@Test
func `returns game characters when mock provides a list`() async throws {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(gameCharacters: Fixtures.gameCharacters))
// WHEN
let gameCharacters = try await service.getGameCharacters()
// THEN
#expect(gameCharacters == Fixtures.gameCharacters)
}
@Test
func `throws notFound when mock provides no game characters`() async {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient())
// WHEN
// THEN
await #expect(throws: AmiiboServiceError.notFound) {
try await service.getGameCharacters()
}
}
@Test(arguments: Errors.all)
func `throws error for game characters when mock is configured with error`(error: AmiiboServiceError) async {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(error: error))
// WHEN
// THEN
await #expect(throws: error) {
try await service.getGameCharacters()
}
}
// MARK: Get Game Series tests
@Test
func `returns empty game series when mock provides an empty list`() async throws {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(gameSeries: []))
// WHEN
let gameSeries = try await service.getGameSeries()
// THEN
#expect(gameSeries.isEmpty)
}
@Test
func `returns game series when mock provides a list`() async throws {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(gameSeries: Fixtures.gameSeries))
// WHEN
let gameSeries = try await service.getGameSeries()
// THEN
#expect(gameSeries == Fixtures.gameSeries)
}
@Test
func `throws notFound when mock provides no game series`() async {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient())
// WHEN
// THEN
await #expect(throws: AmiiboServiceError.notFound) {
try await service.getGameSeries()
}
}
@Test(arguments: Errors.all)
func `throws error for game series when mock is configured with error`(error: AmiiboServiceError) async {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(error: error))
// WHEN
// THEN
await #expect(throws: error) {
try await service.getGameSeries()
}
}
// MARK: Get Last Updated tests
@Test
func `returns date when mock provides a last updated date`() async throws {
// GIVEN
let expectedDate = Date(timeIntervalSince1970: 1_700_000_000)
let service = AmiiboService(client: AmiiboMockClient(lastUpdated: expectedDate))
// WHEN
let lastUpdated = try await service.getLastUpdated()
// THEN
#expect(lastUpdated == expectedDate)
}
@Test
func `throws notFound when mock provides no last updated date`() async {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient())
// WHEN
// THEN
await #expect(throws: AmiiboServiceError.notFound) {
try await service.getLastUpdated()
}
}
@Test(arguments: Errors.all)
func `throws error for last updated when mock is configured with error`(error: AmiiboServiceError) async {
// GIVEN
let service = AmiiboService(client: AmiiboMockClient(error: error))
// WHEN
// THEN
await #expect(throws: error) {
try await service.getLastUpdated()
}
}
}
// MARK: - Arguments
private enum Errors {
/// All possible errors that can be thrown by the service.
static let all: [AmiiboServiceError] = [
.badRequest,
.cancelled,
.decoding,
.notAvailable,
.notFound,
.undocumented(500),
.unknown("An underlying error description.")
]
}
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -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
@@ -78,7 +78,6 @@ extension AmiiboMockClient: AmiiboClient {
// MARK: Functions // MARK: Functions
#if swift(>=6.0)
func getAmiibos( func getAmiibos(
by filter: AmiiboFilter by filter: AmiiboFilter
) async throws(AmiiboServiceError) -> [Amiibo] { ) async throws(AmiiboServiceError) -> [Amiibo] {
@@ -110,43 +109,8 @@ extension AmiiboMockClient: AmiiboClient {
} }
func getLastUpdated() async throws(AmiiboServiceError) -> Date { func getLastUpdated() async throws(AmiiboServiceError) -> Date {
fetchLastUpdatedIfAny()
}
#else
func getAmiibos(
by filter: AmiiboFilter
) async throws -> [Amiibo] {
try fetchAmiibosIfAny()
}
func getAmiiboSeries(
by filter: AmiiboSeriesFilter
) async throws -> [AmiiboSeries] {
try fetchAmiiboSeriesIfAny()
}
func getAmiiboTypes(
by filter: AmiiboTypeFilter
) async throws -> [AmiiboType] {
try fetchAmiiboTypesIfAny()
}
func getGameCharacters(
by filter: GameCharacterFilter
) async throws -> [GameCharacter] {
try fetchGameCharactersIfAny()
}
func getGameSeries(
by filter: GameSeriesFilter
) async throws -> [GameSeries] {
try fetchGameSeriesIfAny()
}
func getLastUpdated() async throws -> Date {
try fetchLastUpdatedIfAny() try fetchLastUpdatedIfAny()
} }
#endif
} }
@@ -159,7 +123,7 @@ private extension AmiiboMockClient {
/// Fetches a list of amiibo items, if any. /// Fetches a list of amiibo items, if any.
/// - Returns: A list of amiibo items. /// - Returns: A list of amiibo items.
/// - Throws: An ``AmiiboServiceError`` error in case an error has been provided. /// - Throws: An ``AmiiboServiceError`` error in case an error has been provided.
func fetchAmiibosIfAny() throws -> [Amiibo] { func fetchAmiibosIfAny() throws(AmiiboServiceError) -> [Amiibo] {
try throwErrorIfExists() try throwErrorIfExists()
guard let amiibos else { guard let amiibos else {
@@ -172,7 +136,7 @@ private extension AmiiboMockClient {
/// Fetches a list of amiibo series, if any. /// Fetches a list of amiibo series, if any.
/// - Returns: A list of amiibo series. /// - Returns: A list of amiibo series.
/// - Throws: An ``AmiiboServiceError`` error in case an error has been provided. /// - Throws: An ``AmiiboServiceError`` error in case an error has been provided.
func fetchAmiiboSeriesIfAny() throws -> [AmiiboSeries] { func fetchAmiiboSeriesIfAny() throws(AmiiboServiceError) -> [AmiiboSeries] {
try throwErrorIfExists() try throwErrorIfExists()
guard let amiiboSeries else { guard let amiiboSeries else {
@@ -185,7 +149,7 @@ private extension AmiiboMockClient {
/// Fetches a list of amiibo types, if any. /// Fetches a list of amiibo types, if any.
/// - Returns: A list of amiibo types. /// - Returns: A list of amiibo types.
/// - Throws: An ``AmiiboServiceError`` error in case an error has been provided. /// - Throws: An ``AmiiboServiceError`` error in case an error has been provided.
func fetchAmiiboTypesIfAny() throws -> [AmiiboType] { func fetchAmiiboTypesIfAny() throws(AmiiboServiceError) -> [AmiiboType] {
try throwErrorIfExists() try throwErrorIfExists()
guard let amiiboTypes else { guard let amiiboTypes else {
@@ -198,7 +162,7 @@ private extension AmiiboMockClient {
/// Fetches a list of game characters, if any. /// Fetches a list of game characters, if any.
/// - Returns: A list of game characters. /// - Returns: A list of game characters.
/// - Throws: An ``AmiiboServiceError`` error in case an error has been provided. /// - Throws: An ``AmiiboServiceError`` error in case an error has been provided.
func fetchGameCharactersIfAny() throws -> [GameCharacter] { func fetchGameCharactersIfAny() throws(AmiiboServiceError) -> [GameCharacter] {
try throwErrorIfExists() try throwErrorIfExists()
guard let gameCharacters else { guard let gameCharacters else {
@@ -211,7 +175,7 @@ private extension AmiiboMockClient {
/// Fetches a list of game series, if any. /// Fetches a list of game series, if any.
/// - Returns: A list of game series, if any. /// - Returns: A list of game series, if any.
/// - Throws: An ``AmiiboServiceError`` error in case an error has been provided. /// - Throws: An ``AmiiboServiceError`` error in case an error has been provided.
func fetchGameSeriesIfAny() throws -> [GameSeries] { func fetchGameSeriesIfAny() throws(AmiiboServiceError) -> [GameSeries] {
try throwErrorIfExists() try throwErrorIfExists()
guard let gameSeries else { guard let gameSeries else {
@@ -224,7 +188,7 @@ private extension AmiiboMockClient {
/// Fetches a last updated date, if any. /// Fetches a last updated date, if any.
/// - Returns: A last updated date. /// - Returns: A last updated date.
/// - Throws: An ``AmiiboServiceError`` error in case an error has been provided. /// - Throws: An ``AmiiboServiceError`` error in case an error has been provided.
func fetchLastUpdatedIfAny() throws -> Date { func fetchLastUpdatedIfAny() throws(AmiiboServiceError) -> Date {
try throwErrorIfExists() try throwErrorIfExists()
guard let lastUpdated else { guard let lastUpdated else {
@@ -234,8 +198,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
@@ -0,0 +1,44 @@
// ===----------------------------------------------------------------------===
//
// This source file is part of the Amiibo Service open source project
//
// Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0
//
// See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors
//
// SPDX-License-Identifier: Apache-2.0
//
// ===----------------------------------------------------------------------===
import Foundation
extension Date {
// MARK: Functions
/// Makes a date from UTC components.
static func utc(
_ year: Int,
_ month: Int,
_ day: Int,
_ hour: Int = 0,
_ minute: Int = 0,
_ second: Int = 0
) -> Date {
var calendar = Calendar(identifier: .gregorian)
calendar.timeZone = .init(secondsFromGMT: 0)!
return calendar.date(from: .init(
year: year,
month: month,
day: day,
hour: hour,
minute: minute,
second: second
))!
}
}
@@ -2,7 +2,7 @@
// //
// This source file is part of the Amiibo Service open source project // This source file is part of the Amiibo Service open source project
// //
// Copyright (c) 2025 Röck+Cöde VoF. and the Amiibo Service project authors // Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0 // Licensed under Apache license v2.0
// //
// See LICENSE for license information // See LICENSE for license information
@@ -21,4 +21,7 @@ extension Tag {
/// Tag that indicates tests against a live backend service. /// Tag that indicates tests against a live backend service.
@Tag static var live: Self @Tag static var live: Self
/// Tag that indicates tests using a mock client.
@Tag static var mock: Self
} }
@@ -0,0 +1,85 @@
// ===----------------------------------------------------------------------===
//
// This source file is part of the Amiibo Service open source project
//
// Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0
//
// See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors
//
// SPDX-License-Identifier: Apache-2.0
//
// ===----------------------------------------------------------------------===
import AmiiboService
import Foundation
/// Ready-made models for testing purposes.
enum Fixtures {
/// Amiibo items; the first one has release dates and related games with usages.
static let amiibos: [Amiibo] = [
.init(
head: "01000000",
tail: "00040002",
name: "Zelda",
type: "Figure",
series: "Super Smash Bros.",
gameCharacter: "Zelda",
gameSeries: "The Legend of Zelda",
image: "https://raw.githubusercontent.com/N3evin/AmiiboAPI/master/images/icon_01000000-00040002.png",
release: .init(
america: Date(timeIntervalSince1970: 1_416_441_600),
australia: Date(timeIntervalSince1970: 1_417_564_800),
europe: Date(timeIntervalSince1970: 1_417_132_800),
japan: Date(timeIntervalSince1970: 1_417_564_800)
),
platform: .init(
switch: [
.init(
identifiers: ["01007EF00011E000"],
name: "The Legend of Zelda: Breath of the Wild",
usages: [.init(explanation: "Spawns a random selection of items.", isWriteable: false)]
)
],
wiiU: [
.init(
identifiers: ["0005000010145000"],
name: "Super Smash Bros. for Wii U",
usages: [.init(explanation: "Unlocks a figure player.", isWriteable: true)]
)
]
)
),
.init(
head: "00000000",
tail: "00000002",
name: "Mario",
type: "Figure",
series: "Super Smash Bros.",
gameCharacter: "Mario",
gameSeries: "Super Mario",
image: "https://raw.githubusercontent.com/N3evin/AmiiboAPI/master/images/icon_00000000-00000002.png"
)
]
/// Amiibo series.
static let amiiboSeries: [AmiiboSeries] = [
.init(key: "0x00", name: "Super Smash Bros."),
.init(key: "0x01", name: "Super Mario")
]
/// Amiibo types.
static let amiiboTypes: [AmiiboType] = [
.init(key: "0x00", name: "Figure"),
.init(key: "0x01", name: "Card")
]
/// Game characters.
static let gameCharacters: [GameCharacter] = [
.init(key: "0x0000", name: "Mario"),
.init(key: "0x0100", name: "Zelda")
]
/// Game series.
static let gameSeries: [GameSeries] = [
.init(key: "0x000", name: "Super Mario"),
.init(key: "0x010", name: "The Legend of Zelda")
]
}
@@ -0,0 +1,72 @@
// ===----------------------------------------------------------------------===
//
// This source file is part of the Amiibo Service open source project
//
// Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0
//
// See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors
//
// SPDX-License-Identifier: Apache-2.0
//
// ===----------------------------------------------------------------------===
import Foundation
import HTTPTypes
import OpenAPIRuntime
/// A transport that answers every request with a canned response, for testing purposes.
struct StubTransport: ClientTransport {
// MARK: Type aliases
/// A closure that builds the response for a request.
typealias Handler = @Sendable (HTTPRequest) throws -> (HTTPResponse, HTTPBody?)
// MARK: Properties
/// The handler that builds the response.
private let handler: Handler
// MARK: Initializers
/// Initializes this transport with a response handler.
init(handler: @escaping Handler) {
self.handler = handler
}
/// Initializes this transport with a fixed response.
init(status: HTTPResponse.Status, json: String? = nil) {
self.init { _ in
Self.response(status: status, json: json)
}
}
// MARK: Functions
func send(
_ request: HTTPRequest,
body: HTTPBody?,
baseURL: URL,
operationID: String
) async throws -> (HTTPResponse, HTTPBody?) {
try handler(request)
}
/// Builds a response with a status and an optional JSON body.
static func response(
status: HTTPResponse.Status,
json: String? = nil
) -> (HTTPResponse, HTTPBody?) {
guard let json else {
return (.init(status: status), nil)
}
return (
.init(status: status, headerFields: [.contentType: "application/json"]),
.init(json)
)
}
}
@@ -0,0 +1,48 @@
// ===----------------------------------------------------------------------===
//
// This source file is part of the Amiibo Service open source project
//
// Copyright (c) 2026 Röck+Cöde VoF. and the Amiibo Service project authors
// Licensed under Apache license v2.0
//
// See LICENSE for license information
// See CONTRIBUTORS for the list of Amiibo Service project authors
//
// SPDX-License-Identifier: Apache-2.0
//
// ===----------------------------------------------------------------------===
import Foundation
import HTTPTypes
import OpenAPIRuntime
/// A transport that throws a given error instead of sending the request, for testing purposes.
///
/// The error reaches the live client wrapped in a `ClientError`, as it would from a real transport.
struct ThrowingTransport: ClientTransport {
// MARK: Properties
/// The error to throw.
private let error: any Error
// MARK: Initializers
/// Initializes this transport.
/// - Parameter error: An error to throw.
init(error: any Error) {
self.error = error
}
// MARK: Functions
func send(
_ request: HTTPRequest,
body: HTTPBody?,
baseURL: URL,
operationID: String
) async throws -> (HTTPResponse, HTTPBody?) {
throw error
}
}
-9
View File
@@ -1,9 +0,0 @@
/*!
* This source file is part of the Swift.org open source project
*
* Copyright (c) 2021 Apple Inc. and the Swift project authors
* Licensed under Apache License v2.0 with Runtime Library Exception
*
* See https://swift.org/LICENSE.txt for license information
* See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/aside[data-v-3ccce809]{-moz-column-break-inside:avoid;break-inside:avoid;border-radius:var(--aside-border-radius,var(--border-radius,4px));border-style:var(--aside-border-style,solid);border-width:var(--aside-border-width,0 0 0 6px);padding:.9411764706rem;text-align:start}aside .label[data-v-3ccce809]{font-size:1rem;line-height:1.5294117647;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}aside .label+[data-v-3ccce809]{margin-top:var(--spacing-stacked-margin-small)}aside.deprecated[data-v-3ccce809]{background-color:var(--color-aside-deprecated-background);border-color:var(--color-aside-deprecated-border);box-shadow:0 0 0 0 var(--color-aside-deprecated-border) inset,0 0 0 0 var(--color-aside-deprecated-border)}aside.deprecated .label[data-v-3ccce809]{color:var(--color-aside-deprecated)}aside.experiment[data-v-3ccce809]{background-color:var(--color-aside-experiment-background);border-color:var(--color-aside-experiment-border);box-shadow:0 0 0 0 var(--color-aside-experiment-border) inset,0 0 0 0 var(--color-aside-experiment-border)}aside.experiment .label[data-v-3ccce809]{color:var(--color-aside-experiment)}aside.important[data-v-3ccce809]{background-color:var(--color-aside-important-background);border-color:var(--color-aside-important-border);box-shadow:0 0 0 0 var(--color-aside-important-border) inset,0 0 0 0 var(--color-aside-important-border)}aside.important .label[data-v-3ccce809]{color:var(--color-aside-important)}aside.note[data-v-3ccce809]{background-color:var(--color-aside-note-background);border-color:var(--color-aside-note-border);box-shadow:0 0 0 0 var(--color-aside-note-border) inset,0 0 0 0 var(--color-aside-note-border)}aside.note .label[data-v-3ccce809]{color:var(--color-aside-note)}aside.tip[data-v-3ccce809]{background-color:var(--color-aside-tip-background);border-color:var(--color-aside-tip-border);box-shadow:0 0 0 0 var(--color-aside-tip-border) inset,0 0 0 0 var(--color-aside-tip-border)}aside.tip .label[data-v-3ccce809]{color:var(--color-aside-tip)}aside.warning[data-v-3ccce809]{background-color:var(--color-aside-warning-background);border-color:var(--color-aside-warning-border);box-shadow:0 0 0 0 var(--color-aside-warning-border) inset,0 0 0 0 var(--color-aside-warning-border)}aside.warning .label[data-v-3ccce809]{color:var(--color-aside-warning)}code[data-v-08295b2f]:before{content:attr(data-before-code)}code[data-v-08295b2f]:after{content:attr(data-after-code)}code[data-v-08295b2f]:after,code[data-v-08295b2f]:before{display:block;position:absolute;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%);overflow:hidden;height:1px;width:1px;padding:0;border:0}.swift-file-icon.file-icon[data-v-c01a6890]{height:1rem}.file-icon[data-v-7c381064]{position:relative;align-items:flex-end;height:24px;margin:0 .5rem 0 1rem}.filename[data-v-c8c40662]{color:var(--text,var(--colors-secondary-label,var(--color-secondary-label)));font-size:.9411764706rem;line-height:1.1875;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);margin-top:1rem}@media only screen and (max-width:735px){.filename[data-v-c8c40662]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);margin-top:0}}.filename>a[data-v-c8c40662],.filename>span[data-v-c8c40662]{display:flex;align-items:center;line-height:normal}a[data-v-c8c40662]{color:var(--url,var(--color-link))}.code-line-container[data-v-13e6923e]{display:inline-block;width:100%;box-sizing:border-box}.code-number[data-v-13e6923e]{display:inline-block;padding:0 1rem 0 8px;text-align:right;min-width:2em;color:#666;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-number[data-v-13e6923e]:before{content:attr(data-line-number)}.highlighted[data-v-13e6923e]{background:var(--line-highlight,var(--color-code-line-highlight));border-left:4px solid var(--color-code-line-highlight-border)}.highlighted .code-number[data-v-13e6923e]{padding-left:4px}pre[data-v-13e6923e]{padding:14px 0;display:flex;overflow:unset;-webkit-overflow-scrolling:touch;white-space:pre;word-wrap:normal;height:100%;-moz-tab-size:var(--code-indentationWidth,4);-o-tab-size:var(--code-indentationWidth,4);tab-size:var(--code-indentationWidth,4)}@media only screen and (max-width:735px){pre[data-v-13e6923e]{padding-top:.8235294118rem}}code[data-v-13e6923e]{white-space:pre;word-wrap:normal;flex-grow:9999}.code-listing[data-v-13e6923e],.container-general[data-v-13e6923e]{display:flex}.code-listing[data-v-13e6923e]{flex-direction:column;border-radius:var(--code-border-radius,var(--border-radius,4px));overflow:hidden;filter:blur(0)}.code-listing.single-line[data-v-13e6923e]{border-radius:var(--border-radius,4px)}.container-general[data-v-13e6923e]{overflow:auto}.container-general[data-v-13e6923e],pre[data-v-13e6923e]{flex-grow:1}.header-anchor[data-v-0d0d1Line truncated
-9
View File
@@ -1,9 +0,0 @@
/*!
* This source file is part of the Swift.org open source project
*
* Copyright (c) 2021 Apple Inc. and the Swift project authors
* Licensed under Apache License v2.0 with Runtime Library Exception
*
* See https://swift.org/LICENSE.txt for license information
* See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/.badge[data-v-04624022]{--badge-color:var(--color-badge-default);--badge-dark-color:var(--color-badge-dark-default);font-size:.7058823529rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:inline-block;padding:2px 4px;white-space:nowrap;border-radius:var(--badge-border-radius,1px);border-style:var(--badge-border-style,none);border-width:var(--badge-border-width,1px);margin:auto;margin-left:5px;color:var(--colors-badge-text,var(--color-badge-text));background-color:var(--badge-color)}@media screen{[data-color-scheme=dark] .badge[data-v-04624022]{background-color:var(--badge-dark-color)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .badge[data-v-04624022]{background-color:var(--badge-dark-color)}}.badge-deprecated[data-v-04624022]{--badge-color:var(--color-badge-deprecated);--badge-dark-color:var(--color-badge-dark-deprecated)}.badge-beta[data-v-04624022]{--badge-color:var(--color-badge-beta);--badge-dark-color:var(--color-badge-dark-beta)}[data-v-3a32ffd0] .code-listing{background:var(--background,var(--color-code-background));color:var(--text,var(--color-code-plain));border-color:var(--colors-grid,var(--color-grid));border-width:var(--code-border-width,1px);border-style:var(--code-border-style,solid)}[data-v-3a32ffd0] .code-listing pre{padding:var(--code-block-style-elements-padding)}[data-v-3a32ffd0] .code-listing pre>code{font-size:.8823529412rem;line-height:1.6666666667;font-weight:400;font-family:var(--typography-html-font-mono,Menlo,monospace)}[data-v-3a32ffd0] *+.code-listing,[data-v-3a32ffd0] *+.endpoint-example,[data-v-3a32ffd0] *+.inline-image-container,[data-v-3a32ffd0] *+aside,[data-v-3a32ffd0] *+figure,[data-v-3a32ffd0] .code-listing+*,[data-v-3a32ffd0] .endpoint-example+*,[data-v-3a32ffd0] .inline-image-container+*,[data-v-3a32ffd0] aside+*,[data-v-3a32ffd0] figure+*{margin-top:var(--spacing-stacked-margin-xlarge)}[data-v-3a32ffd0] *+dl,[data-v-3a32ffd0] dl+*{margin-top:var(--spacing-stacked-margin-large)}[data-v-3a32ffd0] img{display:block;margin:auto;max-width:100%}[data-v-3a32ffd0] ol,[data-v-3a32ffd0] ol li:not(:first-child),[data-v-3a32ffd0] ul,[data-v-3a32ffd0] ul li:not(:first-child){margin-top:var(--spacing-stacked-margin-large)}@media only screen and (max-width:735px){[data-v-3a32ffd0] ol,[data-v-3a32ffd0] ul{margin-left:1.25rem}}[data-v-3a32ffd0] dt:not(:first-child){margin-top:var(--spacing-stacked-margin-large)}[data-v-3a32ffd0] dd{margin-left:2em}.topic-icon-wrapper[data-v-55f9d05d]{display:flex;align-items:center;justify-content:center;height:1.4705882353rem;flex:0 0 1.294rem;width:1.294rem;margin-right:1rem}.topic-icon[data-v-55f9d05d]{height:.8823529412rem;transform:scale(1);-webkit-transform:scale(1);overflow:visible}.topic-icon[data-v-55f9d05d] img{margin:0;display:block;width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.topic-icon.curly-brackets-icon[data-v-55f9d05d]{height:1rem}.token-method[data-v-295ad0ff]{font-weight:700}.token-keyword[data-v-295ad0ff]{color:var(--syntax-keyword,var(--color-syntax-keywords))}.token-number[data-v-295ad0ff]{color:var(--syntax-number,var(--color-syntax-numbers))}.token-string[data-v-295ad0ff]{color:var(--syntax-string,var(--color-syntax-strings))}.attribute-link[data-v-295ad0ff],.token-attribute[data-v-295ad0ff]{color:var(--syntax-attribute,var(--color-syntax-keywords))}.token-internalParam[data-v-295ad0ff]{color:var(--color-syntax-param-internal-name)}.type-identifier-link[data-v-295ad0ff]{color:var(--syntax-type,var(--color-syntax-other-type-names))}.token-removed[data-v-295ad0ff]{background-color:var(--color-highlight-red)}.token-added[data-v-295ad0ff]{background-color:var(--color-highlight-green)}.decorator[data-v-17c84f82],.label[data-v-17c84f82]{color:var(--colors-secondary-label,var(--color-secondary-label))}.label[data-v-17c84f82]{font-size:1rem;line-height:1.4705882353;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.empty-token[data-v-17c84f82]{font-size:0}.empty-token[data-v-17c84f82]:after{content:" ";font-size:1rem}.abstract[data-v-0d9c6bcc],.link-block[data-v-0d9c6bcc] .badge{margin-left:2.294rem}.link-block .badge+.badge[data-v-0d9c6bcc]{margin-left:1rem}.link[data-v-0d9c6bcc]{display:flex}.link-block .badge[data-v-0d9c6bcc]{margin-top:.5rem}.link-block.has-inline-element[data-v-0d9c6bcc]{display:flex;align-items:flex-start;flex-flow:row wrap}.link-block.has-inline-element .badge[data-v-0d9c6bcc]{margin-left:1rem;margin-top:0}.link-block .has-adjacent-elements[data-v-0d9c6bcc]{padding-top:5px;padding-bottom:5px;display:inline-flex}.link-block[data-v-0d9c6bcc],.link[data-v-0d9c6bcc]{box-sizing:inherit}.link-block.changed[data-v-0d9c6bcc],.link.changed[data-v-0d9c6bcc]{padding-right:1rem;padding-left:2.1764705882rem;padding-top:8px;padding-bottom:8px;display:inline-flex;width:100%;box-sizing:border-box}.link-block.changed.changed[data-v-0d9c6Line truncated
@@ -1,9 +0,0 @@
/*!
* This source file is part of the Swift.org open source project
*
* Copyright (c) 2021 Apple Inc. and the Swift project authors
* Licensed under Apache License v2.0 with Runtime Library Exception
*
* See https://swift.org/LICENSE.txt for license information
* See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/.betainfo[data-v-ba3b3cc0]{font-size:.9411764706rem;padding:3rem 0;background-color:var(--color-fill-secondary)}.full-width-container .betainfo-container[data-v-ba3b3cc0]{max-width:820px;margin-left:auto;margin-right:auto;padding-left:80px;padding-right:80px;box-sizing:border-box}@media print{.full-width-container .betainfo-container[data-v-ba3b3cc0]{padding-left:20px;padding-right:20px;max-width:none}}@media only screen and (min-width:1251px){.full-width-container .betainfo-container[data-v-ba3b3cc0]{max-width:980px}}@media only screen and (min-width:1500px){.full-width-container .betainfo-container[data-v-ba3b3cc0]{max-width:1080px}}@media only screen and (max-width:735px){.full-width-container .betainfo-container[data-v-ba3b3cc0]{width:auto;padding-left:20px;padding-right:20px}}.static-width-container .betainfo-container[data-v-ba3b3cc0]{margin-left:auto;margin-right:auto;width:1536px;width:980px}@media only screen and (max-width:1250px){.static-width-container .betainfo-container[data-v-ba3b3cc0]{width:692px}}@media only screen and (max-width:735px){.static-width-container .betainfo-container[data-v-ba3b3cc0]{width:87.5%}}@media only screen and (max-width:320px){.static-width-container .betainfo-container[data-v-ba3b3cc0]{width:215px}}.betainfo-label[data-v-ba3b3cc0]{font-weight:600;font-size:.9411764706rem}.betainfo-content[data-v-ba3b3cc0] p{margin-bottom:10px}a[data-v-2ca5e993]{text-decoration:underline;color:inherit;font-weight:600}.summary-section[data-v-3aa6f694]:last-of-type{margin-right:0}@media only screen and (max-width:735px){.summary-section[data-v-3aa6f694]{margin-right:0}}.title[data-v-246c819c]{color:var(--colors-text,var(--color-text));font-size:.8235294118rem;margin-right:.5rem;text-rendering:optimizeLegibility}.language[data-v-0e39c0ba]{padding-bottom:10px;justify-content:flex-end}.language-list[data-v-0e39c0ba],.language[data-v-0e39c0ba]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);margin-top:0;display:flex;align-items:center}.language-option.swift[data-v-0e39c0ba]{padding-right:10px;border-right:1px solid var(--colors-secondary-label,var(--color-secondary-label))}.language-option.objc[data-v-0e39c0ba]{padding-left:10px}.view-more-link[data-v-3f54e653]{font-size:.8235294118rem;line-height:1.2857142857;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:flex;flex-flow:row-reverse;margin-bottom:1.3rem}.documentation-hero[data-v-283b44ff]{color:var(--color-documentation-intro-figure,var(--color-figure-gray));overflow:hidden;text-align:left;position:relative;padding-right:var(--doc-hero-right-offset)}.documentation-hero[data-v-283b44ff]:before{content:"";background:var(--standard-accent-color,var(--color-documentation-intro-fill,var(--color-fill-tertiary)));position:absolute;width:100%;height:100%}.documentation-hero[data-v-283b44ff]:after{background:transparent;opacity:.85;width:100%;position:absolute;content:"";height:100%;left:0;top:0}@media screen{[data-color-scheme=dark] .documentation-hero[data-v-283b44ff]:after{opacity:.55}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .documentation-hero[data-v-283b44ff]:after{opacity:.55}}.documentation-hero .icon[data-v-283b44ff]{position:absolute;margin-top:10px;margin-right:25px;right:0;width:250px;height:calc(100% - 20px);box-sizing:border-box}@media only screen and (max-width:735px){.documentation-hero .icon[data-v-283b44ff]{display:none}}.documentation-hero .background-icon[data-v-283b44ff]{color:var(--color-documentation-intro-accent,var(--color-figure-gray-secondary));display:block;width:250px;height:auto;opacity:.15;mix-blend-mode:normal;position:absolute;top:50%;left:0;transform:translateY(-50%);max-height:100%}.documentation-hero .background-icon[data-v-283b44ff] img,.documentation-hero .background-icon[data-v-283b44ff] svg{width:100%;height:100%}@media screen{[data-color-scheme=dark] .documentation-hero .background-icon[data-v-283b44ff]{mix-blend-mode:normal;opacity:.15}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .documentation-hero .background-icon[data-v-283b44ff]{mix-blend-mode:normal;opacity:.15}}.documentation-hero__content[data-v-283b44ff]:not(.minimized-hero){padding-top:2.3529411765rem;padding-bottom:2.3529411765rem;position:relative;z-index:1}.full-width-container .documentation-hero__content[data-v-283b44ff]:not(.minimized-hero){max-width:820px;margin-left:auto;margin-right:auto;padding-left:80px;padding-right:80px;box-sizing:border-box}@media print{.full-width-container .documentation-hero__content[data-v-283b44ff]:not(.minimized-hero){padding-left:20px;padding-right:20px;max-width:none}}@media only screen and (min-width:1251px){.full-width-container .documentation-hero__content[data-v-283b44ff]:not(.minimized-hero){max-width:980px}}@media only screen and (min-width:1500px){.full-width-container .documLine truncated
-9
View File
@@ -1,9 +0,0 @@
/*!
* This source file is part of the Swift.org open source project
*
* Copyright (c) 2021 Apple Inc. and the Swift project authors
* Licensed under Apache License v2.0 with Runtime Library Exception
*
* See https://swift.org/LICENSE.txt for license information
* See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/.color-scheme-toggle[data-v-0c0360ce]{--toggle-color-fill:var(--color-button-background);--toggle-color-text:var(--color-fill-blue);font-size:.7058823529rem;line-height:1.3333333333;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);border:1px solid var(--toggle-color-fill);border-radius:var(--toggle-border-radius-outer,var(--border-radius,4px));display:inline-flex;padding:1px}@media screen{[data-color-scheme=dark] .color-scheme-toggle[data-v-0c0360ce]{--toggle-color-text:var(--color-figure-blue)}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .color-scheme-toggle[data-v-0c0360ce]{--toggle-color-text:var(--color-figure-blue)}}@media print{.color-scheme-toggle[data-v-0c0360ce]{display:none}}:root.no-js .color-scheme-toggle[data-v-0c0360ce]{visibility:hidden}input[data-v-0c0360ce]{position:absolute;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(0 0 99.9% 99.9%);clip-path:inset(0 0 99.9% 99.9%);overflow:hidden;height:1px;width:1px;padding:0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.fromkeyboard label[data-v-0c0360ce]:focus-within{outline:4px solid var(--color-focus-color);outline-offset:1px}.text[data-v-0c0360ce]{border:1px solid transparent;border-radius:var(--toggle-border-radius-inner,2px);color:var(--toggle-color-text);display:inline-block;text-align:center;padding:1px 6px;min-width:42px;box-sizing:border-box}.text[data-v-0c0360ce]:hover{cursor:pointer}input:checked+.text[data-v-0c0360ce]{--toggle-color-text:var(--color-button-text);background:var(--toggle-color-fill);border-color:var(--toggle-color-fill)}.footer[data-v-f1d65b2a]{border-top:1px solid var(--color-grid)}.row[data-v-f1d65b2a]{margin-left:auto;margin-right:auto;width:1536px;width:980px;display:flex;flex-direction:row-reverse;margin:20px auto}@media only screen and (max-width:1250px){.row[data-v-f1d65b2a]{width:692px}}@media only screen and (max-width:735px){.row[data-v-f1d65b2a]{width:87.5%}}@media only screen and (max-width:320px){.row[data-v-f1d65b2a]{width:215px}}@media only screen and (max-width:735px){.row[data-v-f1d65b2a]{width:100%;padding:0 .9411764706rem;box-sizing:border-box}}.InitialLoadingPlaceholder[data-v-35c356b6]{background:var(--colors-loading-placeholder-background,var(--color-loading-placeholder-background));height:100vh;width:100%}.svg-icon[data-v-06e5463e]{fill:var(--colors-svg-icon-fill-light,var(--color-svg-icon));transform:scale(1);-webkit-transform:scale(1);overflow:visible}.theme-dark .svg-icon[data-v-06e5463e]{fill:var(--colors-svg-icon-fill-dark,var(--color-svg-icon))}@media screen{[data-color-scheme=dark] .svg-icon[data-v-06e5463e]{fill:var(--colors-svg-icon-fill-dark,var(--color-svg-icon))}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto] .svg-icon[data-v-06e5463e]{fill:var(--colors-svg-icon-fill-dark,var(--color-svg-icon))}}.svg-icon.icon-inline[data-v-06e5463e]{display:inline-block;vertical-align:middle;fill:currentColor}.svg-icon.icon-inline[data-v-06e5463e] .svg-icon-stroke{stroke:currentColor}[data-v-06e5463e] .svg-icon-stroke{stroke:var(--colors-svg-icon-fill-light,var(--color-svg-icon))}.theme-dark[data-v-06e5463e] .svg-icon-stroke{stroke:var(--colors-svg-icon-fill-dark,var(--color-svg-icon))}@media screen{[data-color-scheme=dark][data-v-06e5463e] .svg-icon-stroke{stroke:var(--colors-svg-icon-fill-dark,var(--color-svg-icon))}}@media screen and (prefers-color-scheme:dark){[data-color-scheme=auto][data-v-06e5463e] .svg-icon-stroke{stroke:var(--colors-svg-icon-fill-dark,var(--color-svg-icon))}}.suggest-lang[data-v-c2dca0ae]{background:#000;color:#fff;display:flex;justify-content:center;border-bottom:1px solid var(--color-grid)}.suggest-lang__wrapper[data-v-c2dca0ae]{display:flex;align-items:center;width:100%;max-width:var(--wrapper-max-width,1920px);margin:0 .9411764706rem;position:relative;height:52px}.suggest-lang__link[data-v-c2dca0ae]{font-size:.8235294118rem;line-height:1.4285714286;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);margin:0 auto;color:#09f}.suggest-lang__close-icon-wrapper[data-v-c2dca0ae]{position:absolute;right:-.2352941176rem;top:0;height:100%;box-sizing:border-box;display:flex;align-items:center;z-index:1}.suggest-lang__close-icon-button[data-v-c2dca0ae]{padding:.2352941176rem}.suggest-lang__close-icon-button .close-icon[data-v-c2dca0ae]{width:8px;display:block}.suggest-lang .inline-chevron-right-icon[data-v-c2dca0ae]{padding-left:.2352941176rem;width:8px}select[data-v-d21858a2]{font-size:.7058823529rem;line-height:1.3333333333;font-weight:600;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);color:var(--color-fill-blue);padding-right:15px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:none;cursor:pointer}select[data-v-d21858a2]:hover{text-decoration:underline}.locale-selector[data-v-d21858a2]{position:relative}.svg-iLine truncated
-9
View File
@@ -1,9 +0,0 @@
/*!
* This source file is part of the Swift.org open source project
*
* Copyright (c) 2021 Apple Inc. and the Swift project authors
* Licensed under Apache License v2.0 with Runtime Library Exception
*
* See https://swift.org/LICENSE.txt for license information
* See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/.nav-title-content[data-v-854b4dd6]{max-width:100%}.title[data-v-854b4dd6]{color:var(--color-nav-root-title,currentColor);text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:inline-block;vertical-align:top;max-width:296px}@media only screen and (max-width:1023px){.title[data-v-854b4dd6]{max-width:205px}}@media only screen and (max-width:767px){.title[data-v-854b4dd6]{flex-basis:fill;display:initial;vertical-align:initial;max-width:none}}.subhead[data-v-854b4dd6]{color:var(--color-nav-root-subhead)}.theme-dark .subhead[data-v-854b4dd6]{color:var(--color-nav-dark-root-subhead)}.mobile-dropdown[data-v-2c27d339]{box-sizing:border-box}.nav--in-breakpoint-range .mobile-dropdown[data-v-2c27d339]{padding-left:.2352941176rem;padding-right:.2352941176rem}.mobile-dropdown ul[data-v-2c27d339]{list-style:none}.mobile-dropdown .option[data-v-2c27d339]{cursor:pointer;font-size:.7058823529rem;padding:.5rem 0;display:block;text-decoration:none;color:inherit}.mobile-dropdown .option[data-v-2c27d339]:focus{outline-offset:0}.mobile-dropdown .option.depth1[data-v-2c27d339]{padding-left:.4705882353rem}.active[data-v-2c27d339],.tutorial.router-link-active[data-v-2c27d339]{font-weight:600}.active[data-v-2c27d339]:focus,.tutorial.router-link-active[data-v-2c27d339]:focus{outline:none}.chapter-list[data-v-2c27d339]:not(:first-child){margin-top:1rem}.chapter-name[data-v-2c27d339],.tutorial[data-v-2c27d339]{padding:.5rem 0;font-size:1rem;line-height:1.4705882353;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.section-list[data-v-2c27d339],.tutorial-list[data-v-2c27d339]{padding:0 .5882352941rem}.chapter-list:last-child .tutorial-list[data-v-2c27d339]:last-child{padding-bottom:10em}.chapter-list[data-v-2c27d339]{display:inline-block}.form-element[data-v-f934959a]{position:relative}.form-dropdown[data-v-f934959a]{font-size:1rem;line-height:1.2352941176;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);display:block;box-sizing:border-box;width:100%;height:3.3em;color:var(--color-dropdown-text);padding:1.1176470588rem 2.3529411765rem 0 .9411764706rem;text-align:left;border:1px solid var(--color-dropdown-border);border-radius:var(--border-radius,4px);background-clip:padding-box;margin-bottom:.8235294118rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;min-height:32px}.form-dropdown[data-v-f934959a]:focus{box-shadow:0 0 0 4px var(--color-focus-color);outline:none;border-color:var(--color-focus-border-color)}.form-dropdown.no-eyebrow[data-v-f934959a]{padding-top:0}.form-dropdown[data-v-f934959a]:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--color-dropdown-text)}.form-dropdown[data-v-f934959a]::-ms-expand{opacity:0}.form-dropdown~.form-icon[data-v-f934959a]{position:absolute;display:block;pointer-events:none;fill:var(--color-figure-gray-tertiary);right:14px;width:13px;height:auto;top:50%;transform:translateY(-50%)}.is-open .form-dropdown~.form-icon[data-v-f934959a]{transform:translateY(-50%) scale(-1)}@media only screen and (max-width:735px){.form-dropdown~.form-icon[data-v-f934959a]{right:14px}}.form-dropdown~.form-label[data-v-f934959a]{font-size:.7058823529rem;line-height:1.75;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);position:absolute;top:.4705882353rem;left:17px;color:var(--color-figure-gray-secondary);pointer-events:none;padding:0;z-index:1}.form-dropdown[data-v-f934959a] option{color:var(--color-dropdown-text)}.form-dropdown-selectnone[data-v-f934959a]{color:transparent}.form-dropdown-selectnone~.form-label[data-v-f934959a]{font-size:1rem;line-height:1.2352941176;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif);top:19px;left:17px;color:var(--color-figure-gray-tertiary)}.form-dropdown-selectnone[data-v-f934959a]:-moz-focusring{text-shadow:none}.form-dropdown-selectnone[data-v-f934959a]::-ms-value{display:none}.theme-dark .form-dropdown[data-v-f934959a]{color:var(--color-dropdown-dark-text);background-color:var(--color-dropdown-dark-background);border-color:var(--color-dropdown-dark-border)}.theme-dark .form-dropdown~.form-label[data-v-f934959a]{color:#ccc}.theme-dark .form-dropdown[data-v-f934959a]:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--color-dropdown-dark-text)}.theme-dark .form-dropdown.form-dropdown-selectnone[data-v-f934959a]{color:transparent}.theme-dark .form-dropdown.form-dropdown-selectnone[data-v-f934959a]:-moz-focusring{text-shadow:none}.theme-dark .form-dropdown-selectnone~.form-label[data-v-f934959a]{color:#b0b0b0}.dropdown-small[data-v-6adda760]{height:30px;display:flex;align-items:center;position:relative;background:var(--color-fill)}.dropdown-small .form-dropdown-toggle[data-v-6adda760]{line-height:1.5;font-size:12px;padding-top:0;padding-bottom:0;padding-left:20px;min-height:unseLine truncated
-9
View File
@@ -1,9 +0,0 @@
/*!
* This source file is part of the Swift.org open source project
*
* Copyright (c) 2021 Apple Inc. and the Swift project authors
* Licensed under Apache License v2.0 with Runtime Library Exception
*
* See https://swift.org/LICENSE.txt for license information
* See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/.tutorials-navigation-link[data-v-e9f9b59c]{color:var(--color-tutorials-overview-navigation-link);transition:color .3s linear}.tutorials-navigation-link[data-v-e9f9b59c]:hover{text-decoration:none;transition:none;color:var(--color-tutorials-overview-navigation-link-hover)}.tutorials-navigation-link.active[data-v-e9f9b59c]{color:var(--color-tutorials-overview-navigation-link-active)}.tutorials-navigation-list[data-v-4e0180fa]{list-style-type:none;margin:0}.tutorials-navigation-list li+li[data-v-4e0180fa]:not(.volume--named){margin-top:24px}.tutorials-navigation-list .volume--named+.volume--named[data-v-4e0180fa]{margin-top:12px}.expand-enter-active,.expand-leave-active{transition:height .3s ease-in-out;overflow:hidden}.expand-enter,.expand-leave-to{height:0}.toggle[data-v-489416f8]{color:#f0f0f0;line-height:21px;display:flex;align-items:center;width:100%;font-weight:600;padding:6px 6px 6px 0;border-bottom:1px solid #2a2a2a;text-decoration:none;box-sizing:border-box}@media only screen and (max-width:767px){.toggle[data-v-489416f8]{padding-right:6px;border-bottom-color:hsla(0,0%,100%,.1)}}.toggle .text[data-v-489416f8]{word-break:break-word}.toggle[data-v-489416f8]:hover{text-decoration:none}.toggle .toggle-icon[data-v-489416f8]{display:inline-block;transition:transform .2s ease-in;height:.4em;width:.4em;margin-left:auto;margin-right:.2em}.collapsed .toggle .toggle-icon[data-v-489416f8]{transform:rotate(45deg)}.collapsed .toggle[data-v-489416f8],.collapsed .toggle[data-v-489416f8]:hover{color:#b0b0b0}.tutorials-navigation-menu-content[data-v-489416f8]{opacity:1;transition:height .2s ease-in,opacity .2s ease-in}.collapsed .tutorials-navigation-menu-content[data-v-489416f8]{height:0;opacity:0}.tutorials-navigation-menu-content .tutorials-navigation-list[data-v-489416f8]{padding:24px 0 12px 0}.tutorials-navigation[data-v-79093ed6]{font-size:1rem;line-height:1.2352941176;font-weight:400;font-family:var(--typography-html-font,"Helvetica Neue","Helvetica","Arial",sans-serif)}.nav-title-content[data-v-854b4dd6]{max-width:100%}.title[data-v-854b4dd6]{color:var(--color-nav-root-title,currentColor);text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:inline-block;vertical-align:top;max-width:296px}@media only screen and (max-width:1023px){.title[data-v-854b4dd6]{max-width:205px}}@media only screen and (max-width:767px){.title[data-v-854b4dd6]{flex-basis:fill;display:initial;vertical-align:initial;max-width:none}}.subhead[data-v-854b4dd6]{color:var(--color-nav-root-subhead)}.theme-dark .subhead[data-v-854b4dd6]{color:var(--color-nav-dark-root-subhead)}.nav[data-v-54bcce6d] .nav-menu{padding-top:0}.nav[data-v-54bcce6d] .nav-menu .nav-menu-items{margin-left:auto}@media only screen and (min-width:768px){.nav[data-v-54bcce6d] .nav-menu .nav-menu-items .in-page-navigation{display:none}}@media only screen and (min-width:320px)and (max-width:735px){.nav[data-v-54bcce6d] .nav-menu .nav-menu-items{padding:18px 0 40px}}.hero[data-v-400ffab5]{margin-left:auto;margin-right:auto;width:1536px;width:980px;padding-bottom:4.7058823529rem;padding-top:4.7058823529rem}@media only screen and (max-width:1250px){.hero[data-v-400ffab5]{width:692px}}@media only screen and (max-width:735px){.hero[data-v-400ffab5]{width:87.5%}}@media only screen and (max-width:320px){.hero[data-v-400ffab5]{width:215px}}@media screen{.hero[data-v-400ffab5]{--color-fill:#fff;--color-fill-secondary:#f7f7f7;--color-fill-tertiary:#f0f0f0;--color-fill-quaternary:#282828;--color-fill-blue:#00f;--color-fill-light-blue-secondary:#d1d1ff;--color-fill-gray:#ccc;--color-fill-gray-secondary:#f5f5f5;--color-fill-gray-tertiary:#f0f0f0;--color-fill-gray-quaternary:#f0f0f0;--color-fill-green-secondary:#f0fff0;--color-fill-orange-secondary:#fffaf6;--color-fill-red-secondary:#fff0f5;--color-figure-blue:#36f;--color-figure-gray:#000;--color-figure-gray-secondary:#666;--color-figure-gray-secondary-alt:#666;--color-figure-gray-tertiary:#666;--color-figure-green:green;--color-figure-light-gray:#666;--color-figure-orange:#c30;--color-figure-red:red;--color-tutorials-teal:#000;--color-article-background:var(--color-fill-tertiary);--color-article-body-background:var(--color-fill);--color-aside-deprecated:var(--color-figure-gray);--color-aside-deprecated-background:var(--color-fill-orange-secondary);--color-aside-deprecated-border:var(--color-figure-orange);--color-aside-experiment:var(--color-figure-gray);--color-aside-experiment-background:var(--color-fill-gray-secondary);--color-aside-experiment-border:var(--color-figure-light-gray);--color-aside-important:var(--color-figure-gray);--color-aside-important-background:var(--color-fill-gray-secondary);--color-aside-important-border:var(--color-figure-light-gray);--color-aside-note:var(--color-figure-gray);--color-aside-note-background:var(--color-fill-gray-secondary);--color-aside-note-border:var(--color-figure-light-gray);--color-aside-tip:var(--color-figure-gray);--color-aside-tip-background:var(--color-fill-gray-secondaryLine truncated
@@ -1 +0,0 @@
{"metadata":{"roleHeading":"Framework","externalID":"AmiiboService","modules":[{"name":"AmiiboService"}],"symbolKind":"module","title":"AmiiboService","role":"collection"},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A library that provides everything the developer needs to interact with the "},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"topicSections":[{"title":"Service","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboService"],"anchor":"Service"},{"title":"Clients","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboLiveClient"],"anchor":"Clients"},{"title":"Types","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeries","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboType","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeries"],"anchor":"Types"},{"title":"Filters","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeriesFilter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboTypeFilter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacterFilter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeriesFilter"],"anchor":"Filters"},{"title":"Errors","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboServiceError"],"anchor":"Errors"}],"kind":"symbol","schemaVersion":{"major":0,"minor":3,"patch":0},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice"]}],"sections":[],"primaryContentSections":[{"kind":"content","content":[{"type":"heading","level":2,"text":"Overview","anchor":"Overview"},{"type":"paragraph","inlineContent":[{"type":"text","text":"The "},{"code":"amiibo-service","type":"codeVoice"},{"type":"text","text":" library is a package that allows the developer to interact with the "},{"isActive":true,"identifier":"https:\/\/www.amiiboapi.com","type":"reference"},{"type":"text","text":" backend service seamlessly, by not only providing the "},{"type":"emphasis","inlineContent":[{"type":"text","text":"service"}]},{"type":"text","text":" type but also any possible "},{"type":"emphasis","inlineContent":[{"type":"text","text":"models"}]},{"type":"text","text":", "},{"type":"emphasis","inlineContent":[{"type":"text","text":"filters"}]},{"type":"text","text":", "},{"type":"emphasis","inlineContent":[{"type":"text","text":"errors"}]},{"type":"text","text":" and "},{"type":"emphasis","inlineContent":[{"type":"text","text":"interfaces"}]},{"type":"text","text":" types that might be needed during implementation."}]},{"type":"heading","level":2,"text":"Design","anchor":"Design"},{"type":"paragraph","inlineContent":[{"type":"text","text":"Although it could have been possible to generate a one-to-one RESTful client based on the Open API specification document that describe the available endpoints of the backend service, it was decided to design a "},{"code":"AmiiboService","type":"codeVoice"},{"type":"text","text":" service type that removes the complexities of the API design imposed by the backend service, and provides the developer with a simple interface, and a seamless experience."}]},{"type":"heading","level":2,"text":"Installation","anchor":"Installation"},{"type":"paragraph","inlineContent":[{"type":"text","text":"To use the "},{"code":"AmiiboService","type":"codeVoice"},{"type":"text","text":" library with your package, then add it as a dependency in the "},{"code":"Package.swift","type":"codeVoice"},{"type":"text","text":" file:"}]},{"type":"codeListing","syntax":"swift","code":["let package = Package("," \/\/ name, platforms, products, etc."," dependencies: ["," .package(url: \"https:\/\/github.com\/rock-n-code\/amiibo-service\", from: \"1.1.0\"),"," \/\/ other dependencies"," ],"," targets: ["," .target("," name: \"SomeTarget\", "," dependencies: ["," .product(name: \"AmiiboService\", package: \"amiibo-service\"),"," ]"," )"," \/\/ other targets"," ]",")"]},{"type":"paragraph","inlineContent":[{"type":"text","text":"It is also possible to use the "},{"code":"AmiiboService","type":"codeVoice"},{"type":"text","text":" library with your app in Xcode, then add it as aLine truncated
@@ -1 +0,0 @@
{"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","interfaceLanguage":"swift"},"kind":"symbol","seeAlsoSections":[{"title":"Types","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeries","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboType","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeries"],"anchor":"Types","generated":true}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService"]]},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo"]}],"relationshipsSections":[{"kind":"relationships","title":"Conforms To","identifiers":["doc:\/\/AmiiboService\/s8SendableP","doc:\/\/AmiiboService\/s16SendableMetatypeP"],"type":"conformsTo"}],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Amiibo"}]}]}],"abstract":[{"type":"text","text":"A model that represents an amiibo item."}],"topicSections":[{"title":"Structures","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage"],"anchor":"Structures","generated":true},{"title":"Instance Properties","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/gameCharacter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/gameSeries","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/head","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/identifier","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/image","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/imageURL","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/name","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/platform-swift.property","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/release-swift.property","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/series","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/tail","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/type"],"anchor":"Instance-Properties","generated":true}],"metadata":{"modules":[{"name":"AmiiboService"}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Amiibo"}],"roleHeading":"Structure","externalID":"s:13AmiiboService0A0V","navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"title":"Amiibo","symbolKind":"struct","role":"symbol"},"schemaVersion":{"major":0,"minor":3,"patch":0},"sections":[],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/identifier":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/identifier","fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"identifier","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","preciseIdentifier":"s:SS","kind":"typeIdentifier"}],"abstract":[{"type":"text","text":"An identifier."}],"kind":"symbol","type":"topic","role":"symbol","url":"\/documentation\/amiiboservice\/amiibo\/identifier","title":"identifier"},"doc://AmiiboService/documentation/AmiiboService/AmiiboSeries":{"navigatorTitle":[{"kind":"identifier","text":"AmiiboSeries"}],"title":"AmiiboSeries","kind":"symbol","url":"\/documentation\/amiiboservice\/amiiboseries","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AmiiboSeries"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeries","type":"topic","abstract":[{"text":"A model that represents an amiibo series.","type":"text"}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","kind":"symbol","type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Game","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibo\/game","navigatorTitle":[{"text":"Game","kind":"identifier"}],"title":"Amiibo.Game","abstract":[{"type":"text","text":"A model that represents a game related to an amiibo item."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/release-swift.property":{"identifier":"doc:\/\/AmiiboService\/docLine truncated
@@ -1 +0,0 @@
{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game"},"metadata":{"symbolKind":"struct","extendedModule":"AmiiboService","role":"symbol","title":"Amiibo.Game","modules":[{"name":"AmiiboService"}],"roleHeading":"Structure","navigatorTitle":[{"text":"Game","kind":"identifier"}],"fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Game","kind":"identifier"}],"externalID":"s:13AmiiboService0A0V4GameV"},"relationshipsSections":[{"identifiers":["doc:\/\/AmiiboService\/s8SendableP","doc:\/\/AmiiboService\/s16SendableMetatypeP"],"kind":"relationships","type":"conformsTo","title":"Conforms To"}],"abstract":[{"text":"A model that represents a game related to an amiibo item.","type":"text"}],"topicSections":[{"identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game\/identifiers","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game\/name","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game\/usages"],"anchor":"Instance-Properties","generated":true,"title":"Instance Properties"}],"kind":"symbol","schemaVersion":{"major":0,"patch":0,"minor":3},"variants":[{"paths":["\/documentation\/amiiboservice\/amiibo\/game"],"traits":[{"interfaceLanguage":"swift"}]}],"sections":[],"seeAlsoSections":[{"identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeries","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboType","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeries"],"anchor":"Types","generated":true,"title":"Types"}],"primaryContentSections":[{"declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Game"}]}],"kind":"declarations"}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/Release-swift.struct":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Release"}],"navigatorTitle":[{"text":"Release","kind":"identifier"}],"abstract":[{"type":"text","text":"A model that represents a collection of release dates related to an amiibo item."}],"kind":"symbol","type":"topic","role":"symbol","title":"Amiibo.Release","url":"\/documentation\/amiiboservice\/amiibo\/release-swift.struct"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","kind":"symbol","type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Game","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibo\/game","navigatorTitle":[{"text":"Game","kind":"identifier"}],"title":"Amiibo.Game","abstract":[{"type":"text","text":"A model that represents a game related to an amiibo item."}],"role":"symbol"},"doc://AmiiboService/s8SendableP":{"identifier":"doc:\/\/AmiiboService\/s8SendableP","type":"unresolvable","title":"Swift.Sendable"},"doc://AmiiboService/documentation/AmiiboService/GameCharacter":{"role":"symbol","navigatorTitle":[{"text":"GameCharacter","kind":"identifier"}],"type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"GameCharacter","kind":"identifier"}],"title":"GameCharacter","url":"\/documentation\/amiiboservice\/gamecharacter","abstract":[{"type":"text","text":"A model that represents a game character."}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","kind":"symbol"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/AmiiboType":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboType","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AmiiboType"}],"navigatorTitle":[{"kind":"identifier","text":"AmiiboType"}],"abstract":[{"type":"text","text":"A model that Line truncated
@@ -1 +0,0 @@
{"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game"]]},"primaryContentSections":[{"declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"text":"identifiers","kind":"identifier"},{"text":": [","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"},{"text":"]","kind":"text"}]}],"kind":"declarations"}],"metadata":{"symbolKind":"property","modules":[{"name":"AmiiboService"}],"externalID":"s:13AmiiboService0A0V4GameV11identifiersSaySSGvp","roleHeading":"Instance Property","fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"identifiers"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","preciseIdentifier":"s:SS","text":"String"},{"kind":"text","text":"]"}],"title":"identifiers","role":"symbol"},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game\/identifiers","interfaceLanguage":"swift"},"schemaVersion":{"patch":0,"minor":3,"major":0},"kind":"symbol","abstract":[{"text":"A list of identifiers.","type":"text"}],"variants":[{"paths":["\/documentation\/amiiboservice\/amiibo\/game\/identifiers"],"traits":[{"interfaceLanguage":"swift"}]}],"sections":[],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","role":"symbol","kind":"symbol","type":"topic","title":"Amiibo","navigatorTitle":[{"kind":"identifier","text":"Amiibo"}],"abstract":[{"type":"text","text":"A model that represents an amiibo item."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Amiibo"}],"url":"\/documentation\/amiiboservice\/amiibo"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game/identifiers":{"url":"\/documentation\/amiiboservice\/amiibo\/game\/identifiers","type":"topic","abstract":[{"text":"A list of identifiers.","type":"text"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game\/identifiers","title":"identifiers","role":"symbol","fragments":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"text":"identifiers","kind":"identifier"},{"text":": [","kind":"text"},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"},{"kind":"text","text":"]"}],"kind":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","kind":"symbol","type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Game","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibo\/game","navigatorTitle":[{"text":"Game","kind":"identifier"}],"title":"Amiibo.Game","abstract":[{"type":"text","text":"A model that represents a game related to an amiibo item."}],"role":"symbol"}}}
@@ -1 +0,0 @@
{"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game"]]},"kind":"symbol","schemaVersion":{"major":0,"patch":0,"minor":3},"abstract":[{"type":"text","text":"A name."}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game\/name"},"metadata":{"roleHeading":"Instance Property","modules":[{"name":"AmiiboService"}],"role":"symbol","title":"name","externalID":"s:13AmiiboService0A0V4GameV4nameSSvp","symbolKind":"property","fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"name","kind":"identifier"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"}]},"sections":[],"variants":[{"paths":["\/documentation\/amiiboservice\/amiibo\/game\/name"],"traits":[{"interfaceLanguage":"swift"}]}],"primaryContentSections":[{"declarations":[{"tokens":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"name","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}],"platforms":["macOS"],"languages":["swift"]}],"kind":"declarations"}],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game/name":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game\/name","fragments":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"text":"name","kind":"identifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:SS","text":"String"}],"abstract":[{"text":"A name.","type":"text"}],"kind":"symbol","type":"topic","role":"symbol","title":"name","url":"\/documentation\/amiiboservice\/amiibo\/game\/name"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","role":"symbol","kind":"symbol","type":"topic","title":"Amiibo","navigatorTitle":[{"kind":"identifier","text":"Amiibo"}],"abstract":[{"type":"text","text":"A model that represents an amiibo item."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Amiibo"}],"url":"\/documentation\/amiiboservice\/amiibo"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","kind":"symbol","type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Game","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibo\/game","navigatorTitle":[{"text":"Game","kind":"identifier"}],"title":"Amiibo.Game","abstract":[{"type":"text","text":"A model that represents a game related to an amiibo item."}],"role":"symbol"}}}
@@ -1 +0,0 @@
{"metadata":{"symbolKind":"property","role":"symbol","title":"usages","roleHeading":"Instance Property","modules":[{"name":"AmiiboService"}],"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"usages"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Amiibo","preciseIdentifier":"s:13AmiiboService0A0V"},{"kind":"text","text":"."},{"kind":"typeIdentifier","text":"Usage","preciseIdentifier":"s:13AmiiboService0A0V5UsageV"},{"kind":"text","text":"]?"}],"externalID":"s:13AmiiboService0A0V4GameV6usagesSayAC5UsageVGSgvp"},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game\/usages"},"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/game\/usages"]}],"schemaVersion":{"major":0,"patch":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game"]]},"sections":[],"abstract":[{"text":"A list of amiibo usages, if any.","type":"text"}],"primaryContentSections":[{"declarations":[{"languages":["swift"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"usages"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Amiibo","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","preciseIdentifier":"s:13AmiiboService0A0V"},{"kind":"text","text":"."},{"kind":"typeIdentifier","text":"Usage","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage","preciseIdentifier":"s:13AmiiboService0A0V5UsageV"},{"kind":"text","text":"]?"}],"platforms":["macOS"]}],"kind":"declarations"}],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game/usages":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game\/usages","fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"usages","kind":"identifier"},{"text":": [","kind":"text"},{"text":"Amiibo","kind":"typeIdentifier","preciseIdentifier":"s:13AmiiboService0A0V"},{"text":".","kind":"text"},{"text":"Usage","kind":"typeIdentifier","preciseIdentifier":"s:13AmiiboService0A0V5UsageV"},{"text":"]?","kind":"text"}],"abstract":[{"text":"A list of amiibo usages, if any.","type":"text"}],"kind":"symbol","type":"topic","role":"symbol","url":"\/documentation\/amiiboservice\/amiibo\/game\/usages","title":"usages"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Usage":{"type":"topic","kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"Usage"}],"url":"\/documentation\/amiiboservice\/amiibo\/usage","navigatorTitle":[{"kind":"identifier","text":"Usage"}],"title":"Amiibo.Usage","abstract":[{"type":"text","text":"A model that represents the usage of an amiibo item within a certain game."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","kind":"symbol","type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Game","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibo\/game","navigatorTitle":[{"text":"Game","kind":"identifier"}],"title":"Amiibo.Game","abstract":[{"type":"text","text":"A model that represents a game related to an amiibo item."}],"role":"symbol"}}}
@@ -1 +0,0 @@
{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/gameCharacter"},"metadata":{"fragments":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"gameCharacter"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"}],"modules":[{"name":"AmiiboService"}],"externalID":"s:13AmiiboService0A0V13gameCharacterSSvp","role":"symbol","roleHeading":"Instance Property","symbolKind":"property","title":"gameCharacter"},"abstract":[{"text":"A game character.","type":"text"}],"kind":"symbol","schemaVersion":{"minor":3,"major":0,"patch":0},"variants":[{"paths":["\/documentation\/amiiboservice\/amiibo\/gamecharacter"],"traits":[{"interfaceLanguage":"swift"}]}],"sections":[],"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"text":"gameCharacter","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}],"platforms":["macOS"],"languages":["swift"]}]}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"references":{"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/gameCharacter":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/gameCharacter","role":"symbol","kind":"symbol","type":"topic","title":"gameCharacter","abstract":[{"text":"A game character.","type":"text"}],"fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"gameCharacter","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}],"url":"\/documentation\/amiiboservice\/amiibo\/gamecharacter"}}}
@@ -1 +0,0 @@
{"sections":[],"primaryContentSections":[{"declarations":[{"tokens":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"gameSeries"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}],"platforms":["macOS"],"languages":["swift"]}],"kind":"declarations"}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/gameSeries"},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"abstract":[{"text":"A game series.","type":"text"}],"schemaVersion":{"minor":3,"major":0,"patch":0},"metadata":{"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"text":"gameSeries","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}],"modules":[{"name":"AmiiboService"}],"externalID":"s:13AmiiboService0A0V10gameSeriesSSvp","role":"symbol","title":"gameSeries","symbolKind":"property","roleHeading":"Instance Property"},"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/gameseries"]}],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/gameSeries":{"kind":"symbol","type":"topic","abstract":[{"type":"text","text":"A game series."}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/gameSeries","url":"\/documentation\/amiiboservice\/amiibo\/gameseries","fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"gameSeries"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:SS","text":"String"}],"role":"symbol","title":"gameSeries"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","role":"symbol","kind":"symbol","type":"topic","title":"Amiibo","navigatorTitle":[{"kind":"identifier","text":"Amiibo"}],"abstract":[{"type":"text","text":"A model that represents an amiibo item."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Amiibo"}],"url":"\/documentation\/amiiboservice\/amiibo"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"}}}
@@ -1 +0,0 @@
{"metadata":{"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"head"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"}],"modules":[{"name":"AmiiboService"}],"externalID":"s:13AmiiboService0A0V4headSSvp","role":"symbol","roleHeading":"Instance Property","symbolKind":"property","title":"head"},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/head","interfaceLanguage":"swift"},"sections":[],"kind":"symbol","hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"schemaVersion":{"major":0,"minor":3,"patch":0},"abstract":[{"type":"text","text":"The first 8 hexadecimal characters of an identifier."}],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"head"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"}]}]}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/head"]}],"references":{"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/head":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/head","kind":"symbol","role":"symbol","title":"head","abstract":[{"type":"text","text":"The first 8 hexadecimal characters of an identifier."}],"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"head"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:SS","text":"String"}],"url":"\/documentation\/amiiboservice\/amiibo\/head","type":"topic"}}}
@@ -1 +0,0 @@
{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/identifier"},"metadata":{"roleHeading":"Instance Property","modules":[{"name":"AmiiboService"}],"role":"symbol","title":"identifier","externalID":"s:13AmiiboService0A0V10identifierSSvp","symbolKind":"property","fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"identifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"}]},"abstract":[{"type":"text","text":"An identifier."}],"schemaVersion":{"patch":0,"major":0,"minor":3},"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/identifier"]}],"sections":[],"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"identifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":" { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}],"languages":["swift"]}],"kind":"declarations"}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/identifier":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/identifier","fragments":[{"text":"var","kind":"keyword"},{"text":" ","kind":"text"},{"text":"identifier","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","preciseIdentifier":"s:SS","kind":"typeIdentifier"}],"abstract":[{"type":"text","text":"An identifier."}],"kind":"symbol","type":"topic","role":"symbol","url":"\/documentation\/amiiboservice\/amiibo\/identifier","title":"identifier"}}}
@@ -1 +0,0 @@
{"metadata":{"symbolKind":"property","role":"symbol","title":"image","roleHeading":"Instance Property","modules":[{"name":"AmiiboService"}],"fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"image","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}],"externalID":"s:13AmiiboService0A0V5imageSSvp"},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/image"},"kind":"symbol","variants":[{"paths":["\/documentation\/amiiboservice\/amiibo\/image"],"traits":[{"interfaceLanguage":"swift"}]}],"sections":[],"schemaVersion":{"major":0,"patch":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"abstract":[{"text":"An image link.","type":"text"}],"primaryContentSections":[{"declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"image","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}]}],"kind":"declarations"}],"references":{"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/image":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/image","role":"symbol","kind":"symbol","type":"topic","title":"image","abstract":[{"text":"An image link.","type":"text"}],"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"image"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"}],"url":"\/documentation\/amiiboservice\/amiibo\/image"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"}}}
@@ -1 +0,0 @@
{"metadata":{"modules":[{"name":"AmiiboService"}],"fragments":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"imageURL"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:10Foundation3URLV","text":"URL"},{"kind":"text","text":"?"}],"roleHeading":"Instance Property","externalID":"s:13AmiiboService0A0V8imageURL10Foundation0D0VSgvp","title":"imageURL","symbolKind":"property","role":"symbol"},"sections":[],"kind":"symbol","identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/imageURL","interfaceLanguage":"swift"},"schemaVersion":{"major":0,"minor":3,"patch":0},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"abstract":[{"type":"text","text":"A URL related to an image link, if any."}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/imageurl"]}],"primaryContentSections":[{"declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"var"},{"kind":"text","text":" "},{"kind":"identifier","text":"imageURL"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:10Foundation3URLV","text":"URL"},{"kind":"text","text":"? { "},{"kind":"keyword","text":"get"},{"kind":"text","text":" }"}]}],"kind":"declarations"}],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/imageURL":{"url":"\/documentation\/amiiboservice\/amiibo\/imageurl","type":"topic","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/imageURL","title":"imageURL","abstract":[{"type":"text","text":"A URL related to an image link, if any."}],"role":"symbol","fragments":[{"text":"var","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"imageURL"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:10Foundation3URLV","text":"URL"},{"kind":"text","text":"?"}],"kind":"symbol"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"}}}
@@ -1 +0,0 @@
{"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/name","interfaceLanguage":"swift"},"metadata":{"fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"name","kind":"identifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"}],"modules":[{"name":"AmiiboService"}],"externalID":"s:13AmiiboService0A0V4nameSSvp","role":"symbol","title":"name","symbolKind":"property","roleHeading":"Instance Property"},"abstract":[{"text":"An amiibo name.","type":"text"}],"kind":"symbol","schemaVersion":{"minor":3,"major":0,"patch":0},"variants":[{"paths":["\/documentation\/amiiboservice\/amiibo\/name"],"traits":[{"interfaceLanguage":"swift"}]}],"sections":[],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"name"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"}],"languages":["swift"]}]}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"references":{"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/name":{"title":"name","kind":"symbol","url":"\/documentation\/amiiboservice\/amiibo\/name","fragments":[{"kind":"keyword","text":"let"},{"text":" ","kind":"text"},{"kind":"identifier","text":"name"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/name","type":"topic","abstract":[{"text":"An amiibo name.","type":"text"}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"}}}
@@ -1 +0,0 @@
{"metadata":{"symbolKind":"property","role":"symbol","title":"platform","roleHeading":"Instance Property","modules":[{"name":"AmiiboService"}],"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"platform"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Amiibo","preciseIdentifier":"s:13AmiiboService0A0V"},{"kind":"text","text":"."},{"kind":"typeIdentifier","text":"Platform","preciseIdentifier":"s:13AmiiboService0A0V8PlatformV"},{"kind":"text","text":"?"}],"externalID":"s:13AmiiboService0A0V8platformAC8PlatformVSgvp"},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/platform-swift.property"},"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/platform-swift.property"]}],"schemaVersion":{"patch":0,"major":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"sections":[],"abstract":[{"type":"text","text":"A game platform type, if any."}],"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"platform"},{"kind":"text","text":": "},{"kind":"typeIdentifier","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","text":"Amiibo","preciseIdentifier":"s:13AmiiboService0A0V"},{"kind":"text","text":"."},{"kind":"typeIdentifier","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct","text":"Platform","preciseIdentifier":"s:13AmiiboService0A0V8PlatformV"},{"kind":"text","text":"?"}],"languages":["swift"]}],"kind":"declarations"}],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/platform-swift.property":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/platform-swift.property","role":"symbol","kind":"symbol","type":"topic","title":"platform","abstract":[{"type":"text","text":"A game platform type, if any."}],"fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"platform","kind":"identifier"},{"text":": ","kind":"text"},{"text":"Amiibo","preciseIdentifier":"s:13AmiiboService0A0V","kind":"typeIdentifier"},{"text":".","kind":"text"},{"text":"Platform","preciseIdentifier":"s:13AmiiboService0A0V8PlatformV","kind":"typeIdentifier"},{"text":"?","kind":"text"}],"url":"\/documentation\/amiiboservice\/amiibo\/platform-swift.property"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Platform-swift.struct":{"navigatorTitle":[{"text":"Platform","kind":"identifier"}],"title":"Amiibo.Platform","kind":"symbol","url":"\/documentation\/amiiboservice\/amiibo\/platform-swift.struct","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Platform","kind":"identifier"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct","type":"topic","abstract":[{"type":"text","text":"A model that represents a collection of "},{"code":"WiiU","type":"codeVoice"},{"type":"text","text":", "},{"code":"3DS","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Switch","type":"codeVoice"},{"type":"text","text":" games related to an amiibo item."}],"role":"symbol"}}}
@@ -1 +0,0 @@
{"metadata":{"symbolKind":"struct","extendedModule":"AmiiboService","role":"symbol","title":"Amiibo.Platform","modules":[{"name":"AmiiboService"}],"roleHeading":"Structure","navigatorTitle":[{"text":"Platform","kind":"identifier"}],"fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Platform","kind":"identifier"}],"externalID":"s:13AmiiboService0A0V8PlatformV"},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct","interfaceLanguage":"swift"},"seeAlsoSections":[{"anchor":"Types","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeries","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboType","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeries"],"generated":true,"title":"Types"}],"kind":"symbol","variants":[{"paths":["\/documentation\/amiiboservice\/amiibo\/platform-swift.struct"],"traits":[{"interfaceLanguage":"swift"}]}],"sections":[],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"schemaVersion":{"minor":3,"major":0,"patch":0},"abstract":[{"text":"A model that represents a collection of ","type":"text"},{"code":"WiiU","type":"codeVoice"},{"text":", ","type":"text"},{"code":"3DS","type":"codeVoice"},{"text":", and ","type":"text"},{"type":"codeVoice","code":"Switch"},{"text":" games related to an amiibo item.","type":"text"}],"relationshipsSections":[{"kind":"relationships","identifiers":["doc:\/\/AmiiboService\/s8SendableP","doc:\/\/AmiiboService\/s16SendableMetatypeP"],"type":"conformsTo","title":"Conforms To"}],"topicSections":[{"identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct\/switch","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct\/threeDS","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct\/wiiU"],"title":"Instance Properties","generated":true,"anchor":"Instance-Properties"}],"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Platform"}],"platforms":["macOS"],"languages":["swift"]}]}],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/Release-swift.struct":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Release"}],"navigatorTitle":[{"text":"Release","kind":"identifier"}],"abstract":[{"type":"text","text":"A model that represents a collection of release dates related to an amiibo item."}],"kind":"symbol","type":"topic","role":"symbol","title":"Amiibo.Release","url":"\/documentation\/amiiboservice\/amiibo\/release-swift.struct"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","kind":"symbol","type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Game","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibo\/game","navigatorTitle":[{"text":"Game","kind":"identifier"}],"title":"Amiibo.Game","abstract":[{"type":"text","text":"A model that represents a game related to an amiibo item."}],"role":"symbol"},"doc://AmiiboService/s8SendableP":{"identifier":"doc:\/\/AmiiboService\/s8SendableP","type":"unresolvable","title":"Swift.Sendable"},"doc://AmiiboService/documentation/AmiiboService/GameCharacter":{"role":"symbol","navigatorTitle":[{"text":"GameCharacter","kind":"identifier"}],"type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"GameCharacter","kind":"identifier"}],"title":"GameCharacter","url":"\/documentation\/amiiboservice\/gamecharacter","abstract":[{"type":"text","text":"A model that represents a game character."}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","kind":"symbol"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Platform-swift.strucLine truncated
@@ -1 +0,0 @@
{"kind":"symbol","primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"`switch`","kind":"identifier"},{"text":": [","kind":"text"},{"preciseIdentifier":"s:13AmiiboService0A0V","text":"Amiibo","kind":"typeIdentifier","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"},{"text":".","kind":"text"},{"preciseIdentifier":"s:13AmiiboService0A0V4GameV","text":"Game","kind":"typeIdentifier","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game"},{"text":"]","kind":"text"}],"languages":["swift"]}],"kind":"declarations"}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct"]]},"metadata":{"title":"switch","fragments":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"text":"`switch`","kind":"identifier"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","text":"Amiibo","preciseIdentifier":"s:13AmiiboService0A0V"},{"text":".","kind":"text"},{"preciseIdentifier":"s:13AmiiboService0A0V4GameV","text":"Game","kind":"typeIdentifier"},{"text":"]","kind":"text"}],"modules":[{"name":"AmiiboService"}],"role":"symbol","symbolKind":"property","roleHeading":"Instance Property","externalID":"s:13AmiiboService0A0V8PlatformV6switchSayAC4GameVGvp"},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct\/switch"},"abstract":[{"text":"A list of ","type":"text"},{"code":"Switch","type":"codeVoice"},{"type":"text","text":" games related to an amiibo item."}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/platform-swift.struct\/switch"]}],"sections":[],"schemaVersion":{"minor":3,"major":0,"patch":0},"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","kind":"symbol","type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Game","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibo\/game","navigatorTitle":[{"text":"Game","kind":"identifier"}],"title":"Amiibo.Game","abstract":[{"type":"text","text":"A model that represents a game related to an amiibo item."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Platform-swift.struct/switch":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct\/switch","type":"topic","kind":"symbol","fragments":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"`switch`"},{"text":": [","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:13AmiiboService0A0V","text":"Amiibo"},{"kind":"text","text":"."},{"preciseIdentifier":"s:13AmiiboService0A0V4GameV","kind":"typeIdentifier","text":"Game"},{"kind":"text","text":"]"}],"url":"\/documentation\/amiiboservice\/amiibo\/platform-swift.struct\/switch","title":"switch","abstract":[{"type":"text","text":"A list of "},{"code":"Switch","type":"codeVoice"},{"type":"text","text":" games related to an amiibo item."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Platform-swift.struct":{"navigatorTitle":[{"text":"Platform","kind":"identifier"}],"title":"Amiibo.Platform","kind":"symbol","url":"\/documentation\/amiiboservice\/amiibo\/platform-swift.struct","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Platform","kind":"identifier"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct","type":"topic","abstract":[{"type":"text","text":"A model that represents a collection of "},{"code":"WiiU","type":"codeVoice"},{"type":"text","text":", "},{"code":"3DS","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Switch","type":"codeVoice"},{"type":"text","text":" games related to an amiibo item."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kLine truncated
@@ -1 +0,0 @@
{"metadata":{"title":"threeDS","fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"threeDS"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Amiibo","preciseIdentifier":"s:13AmiiboService0A0V"},{"kind":"text","text":"."},{"kind":"typeIdentifier","text":"Game","preciseIdentifier":"s:13AmiiboService0A0V4GameV"},{"kind":"text","text":"]"}],"modules":[{"name":"AmiiboService"}],"roleHeading":"Instance Property","symbolKind":"property","role":"symbol","externalID":"s:13AmiiboService0A0V8PlatformV7threeDSSayAC4GameVGvp"},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct\/threeDS","interfaceLanguage":"swift"},"abstract":[{"text":"A list of ","type":"text"},{"code":"3DS","type":"codeVoice"},{"text":" games related to an amiibo item.","type":"text"}],"kind":"symbol","schemaVersion":{"major":0,"minor":3,"patch":0},"variants":[{"paths":["\/documentation\/amiiboservice\/amiibo\/platform-swift.struct\/threeds"],"traits":[{"interfaceLanguage":"swift"}]}],"sections":[],"primaryContentSections":[{"declarations":[{"languages":["swift"],"tokens":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"threeDS","kind":"identifier"},{"text":": [","kind":"text"},{"text":"Amiibo","kind":"typeIdentifier","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","preciseIdentifier":"s:13AmiiboService0A0V"},{"text":".","kind":"text"},{"text":"Game","kind":"typeIdentifier","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","preciseIdentifier":"s:13AmiiboService0A0V4GameV"},{"kind":"text","text":"]"}],"platforms":["macOS"]}],"kind":"declarations"}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct"]]},"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/Platform-swift.struct":{"navigatorTitle":[{"text":"Platform","kind":"identifier"}],"title":"Amiibo.Platform","kind":"symbol","url":"\/documentation\/amiiboservice\/amiibo\/platform-swift.struct","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Platform","kind":"identifier"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct","type":"topic","abstract":[{"type":"text","text":"A model that represents a collection of "},{"code":"WiiU","type":"codeVoice"},{"type":"text","text":", "},{"code":"3DS","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Switch","type":"codeVoice"},{"type":"text","text":" games related to an amiibo item."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Platform-swift.struct/threeDS":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct\/threeDS","fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"threeDS"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","preciseIdentifier":"s:13AmiiboService0A0V","text":"Amiibo"},{"kind":"text","text":"."},{"kind":"typeIdentifier","preciseIdentifier":"s:13AmiiboService0A0V4GameV","text":"Game"},{"kind":"text","text":"]"}],"abstract":[{"type":"text","text":"A list of "},{"type":"codeVoice","code":"3DS"},{"type":"text","text":" games related to an amiibo item."}],"kind":"symbol","type":"topic","role":"symbol","title":"threeDS","url":"\/documentation\/amiiboservice\/amiibo\/platform-swift.struct\/threeds"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","kind":"symbol","type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Game","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibo\/game","navigatorTitle":[{"text":"Game","kind":"identifier"}],"title":"Amiibo.Game","abstract":[{"type":"text","text":"A model that represents a game related to an amiibo item."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"sLine truncated
@@ -1 +0,0 @@
{"metadata":{"modules":[{"name":"AmiiboService"}],"fragments":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"wiiU"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Amiibo","preciseIdentifier":"s:13AmiiboService0A0V"},{"kind":"text","text":"."},{"kind":"typeIdentifier","text":"Game","preciseIdentifier":"s:13AmiiboService0A0V4GameV"},{"kind":"text","text":"]"}],"externalID":"s:13AmiiboService0A0V8PlatformV4wiiUSayAC4GameVGvp","roleHeading":"Instance Property","title":"wiiU","symbolKind":"property","role":"symbol"},"kind":"symbol","sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct\/wiiU"},"schemaVersion":{"major":0,"patch":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct"]]},"abstract":[{"text":"A list of ","type":"text"},{"code":"WiiU","type":"codeVoice"},{"text":" games related to an amiibo item.","type":"text"}],"variants":[{"paths":["\/documentation\/amiiboservice\/amiibo\/platform-swift.struct\/wiiu"],"traits":[{"interfaceLanguage":"swift"}]}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"wiiU"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Amiibo","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","preciseIdentifier":"s:13AmiiboService0A0V"},{"kind":"text","text":"."},{"kind":"typeIdentifier","text":"Game","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","preciseIdentifier":"s:13AmiiboService0A0V4GameV"},{"kind":"text","text":"]"}],"languages":["swift"]}]}],"references":{"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Platform-swift.struct/wiiU":{"title":"wiiU","kind":"symbol","url":"\/documentation\/amiiboservice\/amiibo\/platform-swift.struct\/wiiu","fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"wiiU"},{"kind":"text","text":": ["},{"kind":"typeIdentifier","text":"Amiibo","preciseIdentifier":"s:13AmiiboService0A0V"},{"kind":"text","text":"."},{"kind":"typeIdentifier","text":"Game","preciseIdentifier":"s:13AmiiboService0A0V4GameV"},{"kind":"text","text":"]"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct\/wiiU","type":"topic","abstract":[{"text":"A list of ","type":"text"},{"code":"WiiU","type":"codeVoice"},{"text":" games related to an amiibo item.","type":"text"}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Platform-swift.struct":{"navigatorTitle":[{"text":"Platform","kind":"identifier"}],"title":"Amiibo.Platform","kind":"symbol","url":"\/documentation\/amiiboservice\/amiibo\/platform-swift.struct","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Platform","kind":"identifier"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct","type":"topic","abstract":[{"type":"text","text":"A model that represents a collection of "},{"code":"WiiU","type":"codeVoice"},{"type":"text","text":", "},{"code":"3DS","type":"codeVoice"},{"type":"text","text":", and "},{"code":"Switch","type":"codeVoice"},{"type":"text","text":" games related to an amiibo item."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","kind":"symbol","type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Game","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibo\/game","navigatorTitle":[{"text":"Game","kind":"identifier"}],"title":"Amiibo.Game","abstract":[{"type":"text","text":"A model that represents a game related to an amiibo item."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:Line truncated
@@ -1 +0,0 @@
{"metadata":{"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"release"},{"kind":"text","text":": "},{"preciseIdentifier":"s:13AmiiboService0A0V","kind":"typeIdentifier","text":"Amiibo"},{"text":".","kind":"text"},{"text":"Release","preciseIdentifier":"s:13AmiiboService0A0V7ReleaseV","kind":"typeIdentifier"}],"modules":[{"name":"AmiiboService"}],"externalID":"s:13AmiiboService0A0V7releaseAC7ReleaseVvp","role":"symbol","roleHeading":"Instance Property","symbolKind":"property","title":"release"},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/release-swift.property","interfaceLanguage":"swift"},"abstract":[{"text":"A release date.","type":"text"}],"kind":"symbol","schemaVersion":{"major":0,"minor":3,"patch":0},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/release-swift.property"]}],"sections":[],"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"release"},{"kind":"text","text":": "},{"kind":"typeIdentifier","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","text":"Amiibo","preciseIdentifier":"s:13AmiiboService0A0V"},{"kind":"text","text":"."},{"kind":"typeIdentifier","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","text":"Release","preciseIdentifier":"s:13AmiiboService0A0V7ReleaseV"}],"languages":["swift"]}],"kind":"declarations"}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/release-swift.property":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/release-swift.property","fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"release","kind":"identifier"},{"text":": ","kind":"text"},{"text":"Amiibo","preciseIdentifier":"s:13AmiiboService0A0V","kind":"typeIdentifier"},{"text":".","kind":"text"},{"text":"Release","preciseIdentifier":"s:13AmiiboService0A0V7ReleaseV","kind":"typeIdentifier"}],"abstract":[{"type":"text","text":"A release date."}],"kind":"symbol","type":"topic","role":"symbol","url":"\/documentation\/amiiboservice\/amiibo\/release-swift.property","title":"release"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Release-swift.struct":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Release"}],"navigatorTitle":[{"text":"Release","kind":"identifier"}],"abstract":[{"type":"text","text":"A model that represents a collection of release dates related to an amiibo item."}],"kind":"symbol","type":"topic","role":"symbol","title":"Amiibo.Release","url":"\/documentation\/amiiboservice\/amiibo\/release-swift.struct"}}}
@@ -1 +0,0 @@
{"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","interfaceLanguage":"swift"},"metadata":{"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Release"}],"modules":[{"name":"AmiiboService"}],"navigatorTitle":[{"kind":"identifier","text":"Release"}],"externalID":"s:13AmiiboService0A0V7ReleaseV","role":"symbol","extendedModule":"AmiiboService","title":"Amiibo.Release","roleHeading":"Structure","symbolKind":"struct"},"relationshipsSections":[{"type":"conformsTo","title":"Conforms To","kind":"relationships","identifiers":["doc:\/\/AmiiboService\/s8SendableP","doc:\/\/AmiiboService\/s16SendableMetatypeP"]}],"abstract":[{"text":"A model that represents a collection of release dates related to an amiibo item.","type":"text"}],"topicSections":[{"title":"Instance Properties","generated":true,"anchor":"Instance-Properties","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/america","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/australia","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/europe","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/japan"]}],"schemaVersion":{"minor":3,"major":0,"patch":0},"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/release-swift.struct"]}],"sections":[],"seeAlsoSections":[{"title":"Types","generated":true,"anchor":"Types","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeries","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboType","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeries"]}],"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Release"}],"languages":["swift"]}],"kind":"declarations"}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/Usage":{"type":"topic","kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"Usage"}],"url":"\/documentation\/amiiboservice\/amiibo\/usage","navigatorTitle":[{"kind":"identifier","text":"Usage"}],"title":"Amiibo.Usage","abstract":[{"type":"text","text":"A model that represents the usage of an amiibo item within a certain game."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Release-swift.struct/japan":{"type":"topic","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/japan","kind":"symbol","fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"japan"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:10Foundation4DateV","text":"Date"},{"kind":"text","text":"?"}],"url":"\/documentation\/amiiboservice\/amiibo\/release-swift.struct\/japan","title":"japan","abstract":[{"text":"A release date for Japan, if any.","type":"text"}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/GameCharacter":{"role":"symbol","navigatorTitle":[{"text":"GameCharacter","kind":"identifier"}],"type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"GameCharacter","kind":"identifier"}],"title":"GameCharacter","url":"\/documentation\/amiiboservice\/gamecharacter","abstract":[{"type":"text","text":"A model that represents a game character."}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","kind":"symbol"},"doc://AmiiboService/documentation/AmiiboService/AmiiboSeries":{"navigatorTitle":[{"kind":"identifier","text":"AmiiboSeries"}],"title":"AmiiboSeries","kind":"symbol","url":"\/documentation\/amiiboservice\/amiiboseries","fragments":[{"kind":"keywLine truncated
@@ -1 +0,0 @@
{"metadata":{"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"america"},{"kind":"text","text":": "},{"preciseIdentifier":"s:10Foundation4DateV","kind":"typeIdentifier","text":"Date"},{"kind":"text","text":"?"}],"modules":[{"name":"AmiiboService"}],"externalID":"s:13AmiiboService0A0V7ReleaseV7america10Foundation4DateVSgvp","role":"symbol","roleHeading":"Instance Property","symbolKind":"property","title":"america"},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/america","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A release date for North America, if any."}],"kind":"symbol","schemaVersion":{"major":0,"minor":3,"patch":0},"variants":[{"paths":["\/documentation\/amiiboservice\/amiibo\/release-swift.struct\/america"],"traits":[{"interfaceLanguage":"swift"}]}],"sections":[],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"america"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:10Foundation4DateV","text":"Date"},{"kind":"text","text":"?"}],"languages":["swift"]}]}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct"]]},"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/Release-swift.struct/america":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/america","role":"symbol","kind":"symbol","type":"topic","title":"america","abstract":[{"text":"A release date for North America, if any.","type":"text"}],"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"america"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:10Foundation4DateV","text":"Date"},{"kind":"text","text":"?"}],"url":"\/documentation\/amiiboservice\/amiibo\/release-swift.struct\/america"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Release-swift.struct":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Release"}],"navigatorTitle":[{"text":"Release","kind":"identifier"}],"abstract":[{"type":"text","text":"A model that represents a collection of release dates related to an amiibo item."}],"kind":"symbol","type":"topic","role":"symbol","title":"Amiibo.Release","url":"\/documentation\/amiiboservice\/amiibo\/release-swift.struct"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"}}}
@@ -1 +0,0 @@
{"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/australia","interfaceLanguage":"swift"},"kind":"symbol","hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct"]]},"variants":[{"paths":["\/documentation\/amiiboservice\/amiibo\/release-swift.struct\/australia"],"traits":[{"interfaceLanguage":"swift"}]}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"text":"australia","kind":"identifier"},{"kind":"text","text":": "},{"text":"Date","preciseIdentifier":"s:10Foundation4DateV","kind":"typeIdentifier"},{"kind":"text","text":"?"}],"languages":["swift"]}]}],"abstract":[{"text":"A release date for Australia, if any.","type":"text"}],"schemaVersion":{"major":0,"patch":0,"minor":3},"metadata":{"modules":[{"name":"AmiiboService"}],"fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"australia","kind":"identifier"},{"kind":"text","text":": "},{"text":"Date","kind":"typeIdentifier","preciseIdentifier":"s:10Foundation4DateV"},{"text":"?","kind":"text"}],"externalID":"s:13AmiiboService0A0V7ReleaseV9australia10Foundation4DateVSgvp","roleHeading":"Instance Property","title":"australia","symbolKind":"property","role":"symbol"},"sections":[],"references":{"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Release-swift.struct":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Release"}],"navigatorTitle":[{"text":"Release","kind":"identifier"}],"abstract":[{"type":"text","text":"A model that represents a collection of release dates related to an amiibo item."}],"kind":"symbol","type":"topic","role":"symbol","title":"Amiibo.Release","url":"\/documentation\/amiiboservice\/amiibo\/release-swift.struct"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Release-swift.struct/australia":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/australia","kind":"symbol","role":"symbol","title":"australia","abstract":[{"type":"text","text":"A release date for Australia, if any."}],"fragments":[{"kind":"keyword","text":"let"},{"text":" ","kind":"text"},{"kind":"identifier","text":"australia"},{"kind":"text","text":": "},{"text":"Date","preciseIdentifier":"s:10Foundation4DateV","kind":"typeIdentifier"},{"kind":"text","text":"?"}],"type":"topic","url":"\/documentation\/amiiboservice\/amiibo\/release-swift.struct\/australia"}}}
@@ -1 +0,0 @@
{"metadata":{"symbolKind":"property","role":"symbol","title":"europe","roleHeading":"Instance Property","modules":[{"name":"AmiiboService"}],"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"europe"},{"kind":"text","text":": "},{"preciseIdentifier":"s:10Foundation4DateV","kind":"typeIdentifier","text":"Date"},{"kind":"text","text":"?"}],"externalID":"s:13AmiiboService0A0V7ReleaseV6europe10Foundation4DateVSgvp"},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/europe","interfaceLanguage":"swift"},"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/release-swift.struct\/europe"]}],"sections":[],"schemaVersion":{"major":0,"minor":3,"patch":0},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct"]]},"abstract":[{"type":"text","text":"A release date for Europe, if any."}],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"europe"},{"kind":"text","text":": "},{"preciseIdentifier":"s:10Foundation4DateV","kind":"typeIdentifier","text":"Date"},{"kind":"text","text":"?"}]}]}],"references":{"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Release-swift.struct/europe":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/europe","role":"symbol","kind":"symbol","type":"topic","title":"europe","abstract":[{"type":"text","text":"A release date for Europe, if any."}],"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"europe"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:10Foundation4DateV","text":"Date"},{"kind":"text","text":"?"}],"url":"\/documentation\/amiiboservice\/amiibo\/release-swift.struct\/europe"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Release-swift.struct":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Release"}],"navigatorTitle":[{"text":"Release","kind":"identifier"}],"abstract":[{"type":"text","text":"A model that represents a collection of release dates related to an amiibo item."}],"kind":"symbol","type":"topic","role":"symbol","title":"Amiibo.Release","url":"\/documentation\/amiiboservice\/amiibo\/release-swift.struct"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"}}}
@@ -1 +0,0 @@
{"metadata":{"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"japan"},{"kind":"text","text":": "},{"preciseIdentifier":"s:10Foundation4DateV","kind":"typeIdentifier","text":"Date"},{"kind":"text","text":"?"}],"modules":[{"name":"AmiiboService"}],"externalID":"s:13AmiiboService0A0V7ReleaseV5japan10Foundation4DateVSgvp","role":"symbol","roleHeading":"Instance Property","symbolKind":"property","title":"japan"},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/japan","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"A release date for Japan, if any."}],"kind":"symbol","schemaVersion":{"major":0,"minor":3,"patch":0},"variants":[{"paths":["\/documentation\/amiiboservice\/amiibo\/release-swift.struct\/japan"],"traits":[{"interfaceLanguage":"swift"}]}],"sections":[],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"japan"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Date","preciseIdentifier":"s:10Foundation4DateV"},{"kind":"text","text":"?"}]}]}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct"]]},"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Release-swift.struct/japan":{"type":"topic","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct\/japan","kind":"symbol","fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"japan"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:10Foundation4DateV","text":"Date"},{"kind":"text","text":"?"}],"url":"\/documentation\/amiiboservice\/amiibo\/release-swift.struct\/japan","title":"japan","abstract":[{"text":"A release date for Japan, if any.","type":"text"}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Release-swift.struct":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Release"}],"navigatorTitle":[{"text":"Release","kind":"identifier"}],"abstract":[{"type":"text","text":"A model that represents a collection of release dates related to an amiibo item."}],"kind":"symbol","type":"topic","role":"symbol","title":"Amiibo.Release","url":"\/documentation\/amiiboservice\/amiibo\/release-swift.struct"}}}
@@ -1 +0,0 @@
{"metadata":{"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"series"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"}],"modules":[{"name":"AmiiboService"}],"externalID":"s:13AmiiboService0A0V6seriesSSvp","role":"symbol","roleHeading":"Instance Property","symbolKind":"property","title":"series"},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/series","interfaceLanguage":"swift"},"abstract":[{"type":"text","text":"An amiibo series."}],"kind":"symbol","schemaVersion":{"major":0,"minor":3,"patch":0},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/series"]}],"sections":[],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"series"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"}]}]}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/series":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/series","fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"series"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:SS","text":"String"}],"abstract":[{"type":"text","text":"An amiibo series."}],"kind":"symbol","type":"topic","role":"symbol","title":"series","url":"\/documentation\/amiiboservice\/amiibo\/series"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"}}}
@@ -1 +0,0 @@
{"metadata":{"fragments":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"text":"tail","kind":"identifier"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"}],"modules":[{"name":"AmiiboService"}],"externalID":"s:13AmiiboService0A0V4tailSSvp","role":"symbol","roleHeading":"Instance Property","title":"tail","symbolKind":"property"},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/tail","interfaceLanguage":"swift"},"sections":[],"kind":"symbol","hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"schemaVersion":{"major":0,"patch":0,"minor":3},"abstract":[{"text":"The last 8 hexadecimal characters of an identifier.","type":"text"}],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"text":"tail","kind":"identifier"},{"kind":"text","text":": "},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}]}]}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/tail"]}],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/tail":{"kind":"symbol","type":"topic","abstract":[{"text":"The last 8 hexadecimal characters of an identifier.","type":"text"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/tail","url":"\/documentation\/amiiboservice\/amiibo\/tail","fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"tail"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"}],"role":"symbol","title":"tail"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","role":"symbol","kind":"symbol","type":"topic","title":"Amiibo","navigatorTitle":[{"kind":"identifier","text":"Amiibo"}],"abstract":[{"type":"text","text":"A model that represents an amiibo item."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Amiibo"}],"url":"\/documentation\/amiiboservice\/amiibo"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"}}}
@@ -1 +0,0 @@
{"metadata":{"title":"type","fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"type","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","preciseIdentifier":"s:SS","kind":"typeIdentifier"}],"modules":[{"name":"AmiiboService"}],"roleHeading":"Instance Property","role":"symbol","symbolKind":"property","externalID":"s:13AmiiboService0A0V4typeSSvp"},"kind":"symbol","sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/type"},"schemaVersion":{"patch":0,"major":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"abstract":[{"text":"An amiibo type.","type":"text"}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/type"]}],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"tokens":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"type","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","preciseIdentifier":"s:SS","kind":"typeIdentifier"}],"platforms":["macOS"]}]}],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/type":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/type","fragments":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"text":"type","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}],"abstract":[{"text":"An amiibo type.","type":"text"}],"kind":"symbol","type":"topic","role":"symbol","title":"type","url":"\/documentation\/amiiboservice\/amiibo\/type"}}}
@@ -1 +0,0 @@
{"metadata":{"symbolKind":"struct","role":"symbol","extendedModule":"AmiiboService","title":"Amiibo.Usage","roleHeading":"Structure","modules":[{"name":"AmiiboService"}],"navigatorTitle":[{"kind":"identifier","text":"Usage"}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Usage"}],"externalID":"s:13AmiiboService0A0V5UsageV"},"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage"},"seeAlsoSections":[{"identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Platform-swift.struct","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Release-swift.struct","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeries","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboType","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeries"],"anchor":"Types","generated":true,"title":"Types"}],"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/usage"]}],"schemaVersion":{"patch":0,"major":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo"]]},"sections":[],"abstract":[{"type":"text","text":"A model that represents the usage of an amiibo item within a certain game."}],"relationshipsSections":[{"title":"Conforms To","identifiers":["doc:\/\/AmiiboService\/s8SendableP","doc:\/\/AmiiboService\/s16SendableMetatypeP"],"type":"conformsTo","kind":"relationships"}],"topicSections":[{"identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage\/explanation","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage\/isWriteable"],"anchor":"Instance-Properties","generated":true,"title":"Instance Properties"}],"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Usage"}],"languages":["swift"]}],"kind":"declarations"}],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/Game":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Game","kind":"symbol","type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"Game","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibo\/game","navigatorTitle":[{"text":"Game","kind":"identifier"}],"title":"Amiibo.Game","abstract":[{"type":"text","text":"A model that represents a game related to an amiibo item."}],"role":"symbol"},"doc://AmiiboService/s8SendableP":{"identifier":"doc:\/\/AmiiboService\/s8SendableP","type":"unresolvable","title":"Swift.Sendable"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Usage":{"type":"topic","kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"Usage"}],"url":"\/documentation\/amiiboservice\/amiibo\/usage","navigatorTitle":[{"kind":"identifier","text":"Usage"}],"title":"Amiibo.Usage","abstract":[{"type":"text","text":"A model that represents the usage of an amiibo item within a certain game."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/AmiiboType":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboType","fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AmiiboType"}],"navigatorTitle":[{"kind":"identifier","text":"AmiiboType"}],"abstract":[{"type":"text","text":"A model that represents an amiibo type."}],"kind":"symbol","type":"topic","role":"symbol","title":"AmiiboType","url":"\/documentation\/amiiboservice\/amiibotype"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboServiLine truncated
@@ -1 +0,0 @@
{"metadata":{"modules":[{"name":"AmiiboService"}],"fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"explanation","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"}],"externalID":"s:13AmiiboService0A0V5UsageV11explanationSSvp","roleHeading":"Instance Property","title":"explanation","symbolKind":"property","role":"symbol"},"kind":"symbol","sections":[],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage\/explanation"},"schemaVersion":{"patch":0,"major":0,"minor":3},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage"]]},"abstract":[{"type":"text","text":"An explanation of how to use an amiibo item."}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/usage\/explanation"]}],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"explanation","kind":"identifier"},{"text":": ","kind":"text"},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"}]}]}],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/Usage/explanation":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage\/explanation","kind":"symbol","type":"topic","fragments":[{"kind":"keyword","text":"let"},{"text":" ","kind":"text"},{"kind":"identifier","text":"explanation"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:SS","text":"String"}],"url":"\/documentation\/amiiboservice\/amiibo\/usage\/explanation","title":"explanation","abstract":[{"type":"text","text":"An explanation of how to use an amiibo item."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Usage":{"type":"topic","kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"Usage"}],"url":"\/documentation\/amiiboservice\/amiibo\/usage","navigatorTitle":[{"kind":"identifier","text":"Usage"}],"title":"Amiibo.Usage","abstract":[{"type":"text","text":"A model that represents the usage of an amiibo item within a certain game."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","role":"symbol","kind":"symbol","type":"topic","title":"Amiibo","navigatorTitle":[{"kind":"identifier","text":"Amiibo"}],"abstract":[{"type":"text","text":"A model that represents an amiibo item."}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"Amiibo"}],"url":"\/documentation\/amiiboservice\/amiibo"}}}
@@ -1 +0,0 @@
{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage\/isWriteable"},"metadata":{"roleHeading":"Instance Property","modules":[{"name":"AmiiboService"}],"role":"symbol","title":"isWriteable","externalID":"s:13AmiiboService0A0V5UsageV11isWriteableSbvp","symbolKind":"property","fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"isWriteable"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Bool","preciseIdentifier":"s:Sb"}]},"sections":[],"kind":"symbol","hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage"]]},"schemaVersion":{"patch":0,"major":0,"minor":3},"abstract":[{"type":"text","text":"A flag that indicates whether an amiibo item can save game data in it."}],"primaryContentSections":[{"declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"isWriteable"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"Bool","preciseIdentifier":"s:Sb"}],"languages":["swift"]}],"kind":"declarations"}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibo\/usage\/iswriteable"]}],"references":{"doc://AmiiboService/documentation/AmiiboService/Amiibo/Usage":{"type":"topic","kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"kind":"identifier","text":"Usage"}],"url":"\/documentation\/amiiboservice\/amiibo\/usage","navigatorTitle":[{"kind":"identifier","text":"Usage"}],"title":"Amiibo.Usage","abstract":[{"type":"text","text":"A model that represents the usage of an amiibo item within a certain game."}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/Amiibo":{"role":"symbol","type":"topic","url":"\/documentation\/amiiboservice\/amiibo","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"text":"Amiibo","kind":"identifier"}],"abstract":[{"text":"A model that represents an amiibo item.","type":"text"}],"navigatorTitle":[{"text":"Amiibo","kind":"identifier"}],"kind":"symbol","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","title":"Amiibo"},"doc://AmiiboService/documentation/AmiiboService/Amiibo/Usage/isWriteable":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo\/Usage\/isWriteable","kind":"symbol","role":"symbol","title":"isWriteable","abstract":[{"type":"text","text":"A flag that indicates whether an amiibo item can save game data in it."}],"fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"isWriteable","kind":"identifier"},{"text":": ","kind":"text"},{"text":"Bool","preciseIdentifier":"s:Sb","kind":"typeIdentifier"}],"url":"\/documentation\/amiiboservice\/amiibo\/usage\/iswriteable","type":"topic"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"}}}
@@ -1 +0,0 @@
{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient"},"metadata":{"roleHeading":"Protocol","modules":[{"name":"AmiiboService"}],"role":"symbol","title":"AmiiboClient","externalID":"s:13AmiiboService0A6ClientP","symbolKind":"protocol","navigatorTitle":[{"kind":"identifier","text":"AmiiboClient"}],"fragments":[{"kind":"keyword","text":"protocol"},{"kind":"text","text":" "},{"text":"AmiiboClient","kind":"identifier"}]},"sections":[],"kind":"symbol","topicSections":[{"identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getAmiiboSeries(by:)","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getAmiiboTypes(by:)","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getAmiibos(by:)","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getGameCharacters(by:)","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getGameSeries(by:)","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getLastUpdated()"],"title":"Instance Methods","generated":true,"anchor":"Instance-Methods"}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService"]]},"schemaVersion":{"patch":0,"major":0,"minor":3},"abstract":[{"type":"text","text":"A protocol that defines API clients containing all available endpoints to interact with."}],"seeAlsoSections":[{"identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboLiveClient"],"title":"Clients","generated":true,"anchor":"Clients"}],"relationshipsSections":[{"kind":"relationships","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboLiveClient"],"title":"Conforming Types","type":"conformingTypes"}],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"tokens":[{"text":"protocol","kind":"keyword"},{"kind":"text","text":" "},{"kind":"identifier","text":"AmiiboClient"}],"platforms":["macOS"]}]}],"variants":[{"paths":["\/documentation\/amiiboservice\/amiiboclient"],"traits":[{"interfaceLanguage":"swift"}]}],"references":{"doc://AmiiboService/documentation/AmiiboService/AmiiboClient/getAmiiboSeries(by:)":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getAmiiboSeries(by:)","role":"symbol","kind":"symbol","type":"topic","title":"getAmiiboSeries(by:)","abstract":[{"text":"Gets a list of amiibo series based on a given filter.","type":"text"}],"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"getAmiiboSeries"},{"kind":"text","text":"("},{"kind":"externalParam","text":"by"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"AmiiboSeriesFilter","preciseIdentifier":"s:13AmiiboService0A12SeriesFilterV"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> ["},{"kind":"typeIdentifier","text":"AmiiboSeries","preciseIdentifier":"s:13AmiiboService0A6SeriesV"},{"kind":"text","text":"]"}],"url":"\/documentation\/amiiboservice\/amiiboclient\/getamiiboseries(by:)","required":true},"doc://AmiiboService/documentation/AmiiboService/AmiiboClient/getGameSeries(by:)":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getGameSeries(by:)","type":"topic","kind":"symbol","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"getGameSeries"},{"kind":"text","text":"("},{"kind":"externalParam","text":"by"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"GameSeriesFilter","preciseIdentifier":"s:13AmiiboService16GameSeriesFilterV"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> ["},{"kind":"typeIdentifier","text":"GameSeries","preciseIdentifier":"s:13AmiiboService10GameSeriesV"},{"kind":"text","text":"]"}],"url":"\/documentation\/amiiboservice\/amiiboclient\/getgameseries(by:)","title":"getGameSeries(by:)","abstract":[{"text":"Gets a list of game series based on a given filter.","type":"text"}],"role":"symbol","required":true},"doc://AmiiboService/documentation/AmiiboService/AmiiboClient/getLastUpdated()":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getLastUpdated()","kind":"symbol","required":true,"title":"getLastUpdated()","role":"symbol","abstract":[{"text":"Gets the date when the data was last updated.","type":"text"}],"fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"getLastUpdated"},{"kind":"text","text":"() "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"text":"Date","preciseIdentifier":"s:10Foundation4DateV","kind":"typeIdentifier"}],"type":"topic","url":"\/documentation\/amiiboservice\/amiiboclient\/getlastupdated(Line truncated
@@ -1 +0,0 @@
{"metadata":{"symbolKind":"method","role":"symbol","title":"getAmiibos(by:)","roleHeading":"Instance Method","modules":[{"name":"AmiiboService"}],"fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"getAmiibos","kind":"identifier"},{"text":"(","kind":"text"},{"text":"by","kind":"externalParam"},{"text":": ","kind":"text"},{"text":"AmiiboFilter","preciseIdentifier":"s:13AmiiboService0A6FilterV","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"text":" -> [","kind":"text"},{"text":"Amiibo","preciseIdentifier":"s:13AmiiboService0A0V","kind":"typeIdentifier"},{"text":"]","kind":"text"}],"externalID":"s:13AmiiboService0A6ClientP10getAmiibos2bySayAA0A0VGAA0A6FilterV_tYaKF","required":true},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getAmiibos(by:)","interfaceLanguage":"swift"},"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiiboclient\/getamiibos(by:)"]}],"sections":[],"schemaVersion":{"major":0,"minor":3,"patch":0},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient"]]},"abstract":[{"type":"text","text":"Gets a list of amiibo items based on a given filter."}],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"getAmiibos"},{"kind":"text","text":"("},{"kind":"externalParam","text":"by"},{"kind":"text","text":" "},{"kind":"internalParam","text":"filter"},{"kind":"text","text":": "},{"preciseIdentifier":"s:13AmiiboService0A6FilterV","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter","kind":"typeIdentifier","text":"AmiiboFilter"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> ["},{"preciseIdentifier":"s:13AmiiboService0A0V","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/Amiibo","kind":"typeIdentifier","text":"Amiibo"},{"kind":"text","text":"]"}]}]},{"kind":"parameters","parameters":[{"name":"filter","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A filter to remove unwanted items from the result."}]}]}]},{"kind":"content","content":[{"type":"heading","level":2,"text":"Return Value","anchor":"return-value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A list of filtered amiibo items."}]}]},{"kind":"content","content":[{"type":"heading","level":2,"text":"Discussion","anchor":"discussion"},{"type":"aside","name":"Throws","style":"note","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"An "},{"isActive":true,"type":"reference","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboServiceError"},{"type":"text","text":" error in case some issue is encountered while generating the result."}]}]}]}],"references":{"doc://AmiiboService/documentation/AmiiboService/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboService","role":"symbol","kind":"symbol","type":"topic","title":"AmiiboService","navigatorTitle":[{"text":"AmiiboService","kind":"identifier"}],"abstract":[{"type":"text","text":"A type that implements the service that uses a client to make calls."}],"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AmiiboService"}],"url":"\/documentation\/amiiboservice\/amiiboservice"},"doc://AmiiboService/documentation/AmiiboService/AmiiboClient/getAmiibos(by:)":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getAmiibos(by:)","role":"symbol","kind":"symbol","type":"topic","title":"getAmiibos(by:)","abstract":[{"type":"text","text":"Gets a list of amiibo items based on a given filter."}],"fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"getAmiibos","kind":"identifier"},{"text":"(","kind":"text"},{"text":"by","kind":"externalParam"},{"text":": ","kind":"text"},{"text":"AmiiboFilter","preciseIdentifier":"s:13AmiiboService0A6FilterV","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"text":" -> [","kind":"text"},{"text":"Amiibo","preciseIdentifier":"s:13AmiiboService0A0V","kind":"typeIdentifier"},{"text":"]","kind":"text"}],"url":"\/documentation\/amiiboservice\/amiiboclient\/getamiibos(by:)","required":true},"doc://AmiiboService/documentation/AmiiboService/AmiiboFilter":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter","kind":"symbol","role":"symbol","title":"AmiiboFilter","abstract":[{"type":"text","text":"A type that contains values to fineLine truncated
@@ -1 +0,0 @@
{"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getAmiiboSeries(by:)","interfaceLanguage":"swift"},"metadata":{"symbolKind":"method","modules":[{"name":"AmiiboService"}],"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"getAmiiboSeries"},{"kind":"text","text":"("},{"kind":"externalParam","text":"by"},{"kind":"text","text":": "},{"kind":"typeIdentifier","preciseIdentifier":"s:13AmiiboService0A12SeriesFilterV","text":"AmiiboSeriesFilter"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> ["},{"kind":"typeIdentifier","preciseIdentifier":"s:13AmiiboService0A6SeriesV","text":"AmiiboSeries"},{"kind":"text","text":"]"}],"externalID":"s:13AmiiboService0A6ClientP03getA6Series2bySayAA0aE0VGAA0aE6FilterV_tYaKF","role":"symbol","roleHeading":"Instance Method","title":"getAmiiboSeries(by:)","required":true},"abstract":[{"type":"text","text":"Gets a list of amiibo series based on a given filter."}],"schemaVersion":{"minor":3,"major":0,"patch":0},"kind":"symbol","variants":[{"paths":["\/documentation\/amiiboservice\/amiiboclient\/getamiiboseries(by:)"],"traits":[{"interfaceLanguage":"swift"}]}],"sections":[],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"getAmiiboSeries"},{"kind":"text","text":"("},{"kind":"externalParam","text":"by"},{"kind":"text","text":" "},{"kind":"internalParam","text":"filter"},{"kind":"text","text":": "},{"preciseIdentifier":"s:13AmiiboService0A12SeriesFilterV","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeriesFilter","kind":"typeIdentifier","text":"AmiiboSeriesFilter"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> ["},{"preciseIdentifier":"s:13AmiiboService0A6SeriesV","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeries","kind":"typeIdentifier","text":"AmiiboSeries"},{"kind":"text","text":"]"}]}]},{"kind":"parameters","parameters":[{"name":"filter","content":[{"type":"paragraph","inlineContent":[{"text":"A filter to remove unwanted items from the result.","type":"text"}]}]}]},{"kind":"content","content":[{"type":"heading","level":2,"text":"Return Value","anchor":"return-value"},{"type":"paragraph","inlineContent":[{"type":"text","text":"A list of filtered amiibo series."}]}]},{"kind":"content","content":[{"type":"heading","level":2,"text":"Discussion","anchor":"discussion"},{"type":"aside","name":"Throws","style":"note","content":[{"type":"paragraph","inlineContent":[{"text":"An ","type":"text"},{"isActive":true,"type":"reference","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboServiceError"},{"text":" error in case some issue is encountered while generating the result.","type":"text"}]}]}]}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient"]]},"references":{"doc://AmiiboService/documentation/AmiiboService/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboService","role":"symbol","kind":"symbol","type":"topic","title":"AmiiboService","navigatorTitle":[{"text":"AmiiboService","kind":"identifier"}],"abstract":[{"type":"text","text":"A type that implements the service that uses a client to make calls."}],"fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AmiiboService"}],"url":"\/documentation\/amiiboservice\/amiiboservice"},"doc://AmiiboService/documentation/AmiiboService/AmiiboSeriesFilter":{"navigatorTitle":[{"kind":"identifier","text":"AmiiboSeriesFilter"}],"title":"AmiiboSeriesFilter","kind":"symbol","url":"\/documentation\/amiiboservice\/amiiboseriesfilter","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AmiiboSeriesFilter"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeriesFilter","type":"topic","abstract":[{"text":"A type that contains values to fine-tune a response when requesting amiibo series.","type":"text"}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/AmiiboClient/getAmiiboSeries(by:)":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getAmiiboSeries(by:)","role":"symbol","kind":"symbol","type":"topic","title":"getAmiiboSeries(by:)","abstract":[{"text":"Gets a list of amiibo series based on a given filter.","type":"text"}],"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"getAmiiboSeries"},{"kind":"text","text":"("},{"kind":"externalParam","text":"by"},{"kind":"text","text":": "},{"Line truncated
@@ -1 +0,0 @@
{"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getAmiiboTypes(by:)","interfaceLanguage":"swift"},"kind":"symbol","hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient"]]},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiiboclient\/getamiibotypes(by:)"]}],"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"getAmiiboTypes"},{"kind":"text","text":"("},{"text":"by","kind":"externalParam"},{"kind":"text","text":" "},{"kind":"internalParam","text":"filter"},{"kind":"text","text":": "},{"kind":"typeIdentifier","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboTypeFilter","text":"AmiiboTypeFilter","preciseIdentifier":"s:13AmiiboService0A10TypeFilterV"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> ["},{"kind":"typeIdentifier","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboType","text":"AmiiboType","preciseIdentifier":"s:13AmiiboService0A4TypeV"},{"kind":"text","text":"]"}],"languages":["swift"],"platforms":["macOS"]}]},{"kind":"parameters","parameters":[{"name":"filter","content":[{"inlineContent":[{"type":"text","text":"A filter to remove unwanted items from the result."}],"type":"paragraph"}]}]},{"kind":"content","content":[{"anchor":"return-value","text":"Return Value","type":"heading","level":2},{"inlineContent":[{"text":"A list of filtered amiibo types.","type":"text"}],"type":"paragraph"}]},{"kind":"content","content":[{"anchor":"discussion","text":"Discussion","type":"heading","level":2},{"name":"Throws","type":"aside","style":"note","content":[{"inlineContent":[{"text":"An ","type":"text"},{"isActive":true,"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboServiceError","type":"reference"},{"text":" error in case some issue is encountered while generating the result.","type":"text"}],"type":"paragraph"}]}]}],"abstract":[{"type":"text","text":"Gets a list of amiibo types based on a given filter."}],"schemaVersion":{"minor":3,"major":0,"patch":0},"metadata":{"modules":[{"name":"AmiiboService"}],"fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"getAmiiboTypes"},{"kind":"text","text":"("},{"kind":"externalParam","text":"by"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","preciseIdentifier":"s:13AmiiboService0A10TypeFilterV","text":"AmiiboTypeFilter"},{"text":") ","kind":"text"},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"text":" -> [","kind":"text"},{"kind":"typeIdentifier","text":"AmiiboType","preciseIdentifier":"s:13AmiiboService0A4TypeV"},{"text":"]","kind":"text"}],"roleHeading":"Instance Method","externalID":"s:13AmiiboService0A6ClientP03getA5Types2bySayAA0A4TypeVGAA0aG6FilterV_tYaKF","title":"getAmiiboTypes(by:)","symbolKind":"method","role":"symbol","required":true},"sections":[],"references":{"doc://AmiiboService/documentation/AmiiboService/AmiiboServiceError":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboServiceError","fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"text":"AmiiboServiceError","kind":"identifier"}],"navigatorTitle":[{"text":"AmiiboServiceError","kind":"identifier"}],"abstract":[{"text":"A representation of all the possible errors that the ","type":"text"},{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboService","isActive":true,"type":"reference"},{"text":" service could throw.","type":"text"}],"kind":"symbol","type":"topic","role":"symbol","url":"\/documentation\/amiiboservice\/amiiboserviceerror","title":"AmiiboServiceError"},"doc://AmiiboService/documentation/AmiiboService/AmiiboTypeFilter":{"navigatorTitle":[{"text":"AmiiboTypeFilter","kind":"identifier"}],"kind":"symbol","type":"topic","abstract":[{"text":"A type that contains values to fine-tune a response when requesting amiibo types.","type":"text"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboTypeFilter","url":"\/documentation\/amiiboservice\/amiibotypefilter","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"AmiiboTypeFilter","kind":"identifier"}],"role":"symbol","title":"AmiiboTypeFilter"},"doc://AmiiboService/documentation/AmiiboService/AmiiboClient/getAmiiboTypes(by:)":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getAmiiboTypes(by:)","kind":"symbol","type":"topic","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"getAmiiboTypes"},{"kind":"text","text":"("},{"kind":"externalParam","text":"by"},{"kind":"text","text":": "},{"kLine truncated
@@ -1 +0,0 @@
{"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getGameCharacters(by:)","interfaceLanguage":"swift"},"metadata":{"symbolKind":"method","modules":[{"name":"AmiiboService"}],"fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"getGameCharacters","kind":"identifier"},{"text":"(","kind":"text"},{"text":"by","kind":"externalParam"},{"text":": ","kind":"text"},{"text":"GameCharacterFilter","preciseIdentifier":"s:13AmiiboService19GameCharacterFilterV","kind":"typeIdentifier"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"text":" -> [","kind":"text"},{"text":"GameCharacter","preciseIdentifier":"s:13AmiiboService13GameCharacterV","kind":"typeIdentifier"},{"text":"]","kind":"text"}],"externalID":"s:13AmiiboService0A6ClientP17getGameCharacters2bySayAA0E9CharacterVGAA0eH6FilterV_tYaKF","role":"symbol","title":"getGameCharacters(by:)","roleHeading":"Instance Method","required":true},"abstract":[{"text":"Gets a list of game characters based on a given filter.","type":"text"}],"kind":"symbol","schemaVersion":{"minor":3,"major":0,"patch":0},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiiboclient\/getgamecharacters(by:)"]}],"sections":[],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"getGameCharacters"},{"kind":"text","text":"("},{"kind":"externalParam","text":"by"},{"kind":"text","text":" "},{"kind":"internalParam","text":"filter"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"GameCharacterFilter","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacterFilter","preciseIdentifier":"s:13AmiiboService19GameCharacterFilterV"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> ["},{"kind":"typeIdentifier","text":"GameCharacter","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","preciseIdentifier":"s:13AmiiboService13GameCharacterV"},{"kind":"text","text":"]"}],"languages":["swift"]}]},{"kind":"parameters","parameters":[{"name":"filter","content":[{"inlineContent":[{"type":"text","text":"A filter to remove unwanted items from the result."}],"type":"paragraph"}]}]},{"kind":"content","content":[{"anchor":"return-value","text":"Return Value","type":"heading","level":2},{"inlineContent":[{"type":"text","text":"A list of filtered game characters."}],"type":"paragraph"}]},{"kind":"content","content":[{"anchor":"discussion","text":"Discussion","type":"heading","level":2},{"name":"Throws","type":"aside","style":"note","content":[{"inlineContent":[{"type":"text","text":"An "},{"type":"reference","isActive":true,"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboServiceError"},{"type":"text","text":" error in case some issue is encountered while generating the result."}],"type":"paragraph"}]}]}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient"]]},"references":{"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/GameCharacter":{"role":"symbol","navigatorTitle":[{"text":"GameCharacter","kind":"identifier"}],"type":"topic","fragments":[{"text":"struct","kind":"keyword"},{"text":" ","kind":"text"},{"text":"GameCharacter","kind":"identifier"}],"title":"GameCharacter","url":"\/documentation\/amiiboservice\/gamecharacter","abstract":[{"type":"text","text":"A model that represents a game character."}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacter","kind":"symbol"},"doc://AmiiboService/documentation/AmiiboService/AmiiboClient":{"navigatorTitle":[{"kind":"identifier","text":"AmiiboClient"}],"title":"AmiiboClient","kind":"symbol","url":"\/documentation\/amiiboservice\/amiiboclient","fragments":[{"kind":"keyword","text":"protocol"},{"kind":"text","text":" "},{"kind":"identifier","text":"AmiiboClient"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient","type":"topic","abstract":[{"text":"A protocol that defines API clients containing all available endpoints to interact with.","type":"text"}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/AmiiboServiceError":{"identifier":"doc:\/\/AmiiboService\/dLine truncated
@@ -1 +0,0 @@
{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getGameSeries(by:)"},"kind":"symbol","hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient"]]},"variants":[{"paths":["\/documentation\/amiiboservice\/amiiboclient\/getgameseries(by:)"],"traits":[{"interfaceLanguage":"swift"}]}],"primaryContentSections":[{"declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"getGameSeries","kind":"identifier"},{"text":"(","kind":"text"},{"text":"by","kind":"externalParam"},{"text":" ","kind":"text"},{"text":"filter","kind":"internalParam"},{"text":": ","kind":"text"},{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeriesFilter","text":"GameSeriesFilter","kind":"typeIdentifier","preciseIdentifier":"s:13AmiiboService16GameSeriesFilterV"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"text":" -> [","kind":"text"},{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeries","text":"GameSeries","kind":"typeIdentifier","preciseIdentifier":"s:13AmiiboService10GameSeriesV"},{"text":"]","kind":"text"}]}],"kind":"declarations"},{"parameters":[{"name":"filter","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"A filter to remove unwanted items from the result."}]}]}],"kind":"parameters"},{"kind":"content","content":[{"level":2,"text":"Return Value","anchor":"return-value","type":"heading"},{"type":"paragraph","inlineContent":[{"text":"A list of filtered game series.","type":"text"}]}]},{"kind":"content","content":[{"level":2,"text":"Discussion","anchor":"discussion","type":"heading"},{"name":"Throws","style":"note","type":"aside","content":[{"type":"paragraph","inlineContent":[{"type":"text","text":"An "},{"type":"reference","isActive":true,"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboServiceError"},{"type":"text","text":" error in case some issue is encountered while generating the result."}]}]}]}],"abstract":[{"text":"Gets a list of game series based on a given filter.","type":"text"}],"schemaVersion":{"major":0,"patch":0,"minor":3},"metadata":{"title":"getGameSeries(by:)","fragments":[{"text":"func","kind":"keyword"},{"text":" ","kind":"text"},{"text":"getGameSeries","kind":"identifier"},{"text":"(","kind":"text"},{"text":"by","kind":"externalParam"},{"text":": ","kind":"text"},{"text":"GameSeriesFilter","kind":"typeIdentifier","preciseIdentifier":"s:13AmiiboService16GameSeriesFilterV"},{"text":") ","kind":"text"},{"text":"async","kind":"keyword"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"text":" -> [","kind":"text"},{"text":"GameSeries","kind":"typeIdentifier","preciseIdentifier":"s:13AmiiboService10GameSeriesV"},{"text":"]","kind":"text"}],"modules":[{"name":"AmiiboService"}],"roleHeading":"Instance Method","role":"symbol","required":true,"symbolKind":"method","externalID":"s:13AmiiboService0A6ClientP13getGameSeries2bySayAA0eF0VGAA0eF6FilterV_tYaKF"},"sections":[],"references":{"doc://AmiiboService/documentation/AmiiboService/AmiiboClient/getGameSeries(by:)":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getGameSeries(by:)","type":"topic","kind":"symbol","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"getGameSeries"},{"kind":"text","text":"("},{"kind":"externalParam","text":"by"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"GameSeriesFilter","preciseIdentifier":"s:13AmiiboService16GameSeriesFilterV"},{"kind":"text","text":") "},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> ["},{"kind":"typeIdentifier","text":"GameSeries","preciseIdentifier":"s:13AmiiboService10GameSeriesV"},{"kind":"text","text":"]"}],"url":"\/documentation\/amiiboservice\/amiiboclient\/getgameseries(by:)","title":"getGameSeries(by:)","abstract":[{"text":"Gets a list of game series based on a given filter.","type":"text"}],"role":"symbol","required":true},"doc://AmiiboService/documentation/AmiiboService/GameSeriesFilter":{"type":"topic","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeriesFilter","navigatorTitle":[{"text":"GameSeriesFilter","kind":"identifier"}],"kind":"symbol","url":"\/documentation\/amiiboservice\/gameseriesfilter","abstract":[{"text":"A type that contains values to fine-tune a response when requesting game series.","type":"text"}],"fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"GameSeriesFilter","kind":"identifier"}],"title":"GameSeriesFilter","role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/GameSeries":{"role":"symbol","navigatorTitle":[{"kind":"identifier","textLine truncated
@@ -1 +0,0 @@
{"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getLastUpdated()"},"metadata":{"roleHeading":"Instance Method","modules":[{"name":"AmiiboService"}],"required":true,"symbolKind":"method","externalID":"s:13AmiiboService0A6ClientP14getLastUpdated10Foundation4DateVyYaKF","fragments":[{"kind":"keyword","text":"func"},{"kind":"text","text":" "},{"kind":"identifier","text":"getLastUpdated"},{"kind":"text","text":"() "},{"kind":"keyword","text":"async"},{"text":" ","kind":"text"},{"text":"throws","kind":"keyword"},{"text":" -> ","kind":"text"},{"preciseIdentifier":"s:10Foundation4DateV","text":"Date","kind":"typeIdentifier"}],"title":"getLastUpdated()","role":"symbol"},"abstract":[{"text":"Gets the date when the data was last updated.","type":"text"}],"kind":"symbol","schemaVersion":{"patch":0,"major":0,"minor":3},"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiiboclient\/getlastupdated()"]}],"sections":[],"primaryContentSections":[{"kind":"declarations","declarations":[{"tokens":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"text":"getLastUpdated","kind":"identifier"},{"text":"() ","kind":"text"},{"kind":"keyword","text":"async"},{"kind":"text","text":" "},{"kind":"keyword","text":"throws"},{"kind":"text","text":" -> "},{"text":"Date","preciseIdentifier":"s:10Foundation4DateV","kind":"typeIdentifier"}],"platforms":["macOS"],"languages":["swift"]}]},{"kind":"content","content":[{"type":"heading","anchor":"return-value","level":2,"text":"Return Value"},{"inlineContent":[{"type":"text","text":"A last updated date."}],"type":"paragraph"}]},{"kind":"content","content":[{"text":"Discussion","anchor":"discussion","level":2,"type":"heading"},{"style":"note","type":"aside","name":"Throws","content":[{"inlineContent":[{"text":"An ","type":"text"},{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboServiceError","type":"reference","isActive":true},{"text":" error in case some issue is encountered while generating the result.","type":"text"}],"type":"paragraph"}]}]}],"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient"]]},"references":{"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/AmiiboClient":{"navigatorTitle":[{"kind":"identifier","text":"AmiiboClient"}],"title":"AmiiboClient","kind":"symbol","url":"\/documentation\/amiiboservice\/amiiboclient","fragments":[{"kind":"keyword","text":"protocol"},{"kind":"text","text":" "},{"kind":"identifier","text":"AmiiboClient"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient","type":"topic","abstract":[{"text":"A protocol that defines API clients containing all available endpoints to interact with.","type":"text"}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/AmiiboServiceError":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboServiceError","fragments":[{"kind":"keyword","text":"enum"},{"kind":"text","text":" "},{"text":"AmiiboServiceError","kind":"identifier"}],"navigatorTitle":[{"text":"AmiiboServiceError","kind":"identifier"}],"abstract":[{"text":"A representation of all the possible errors that the ","type":"text"},{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboService","isActive":true,"type":"reference"},{"text":" service could throw.","type":"text"}],"kind":"symbol","type":"topic","role":"symbol","url":"\/documentation\/amiiboservice\/amiiboserviceerror","title":"AmiiboServiceError"},"doc://AmiiboService/documentation/AmiiboService/AmiiboClient/getLastUpdated()":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboClient\/getLastUpdated()","kind":"symbol","required":true,"title":"getLastUpdated()","role":"symbol","abstract":[{"text":"Gets the date when the data was last updated.","type":"text"}],"fragments":[{"kind":"keyword","text":"func"},{"text":" ","kind":"text"},{"kind":"identifier","text":"getLastUpdated"},{"kind":"text","text":"() "},{"text":"async","kind":"keyword"},{"kind":"text","text":" "},{"text":"throws","kind":"keyword"},{"kind":"text","text":" -> "},{"text":"Date","preciseIdentifier":"s:10Foundation4DateV","kind":"typeIdentifier"}],"type":"topic","url":"\/documentation\/amiiboservice\/amiiboclient\/getlastupdated()"},"doc://AmiiboService/documentation/AmiiboService/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboSLine truncated
@@ -1 +0,0 @@
{"sections":[],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"languages":["swift"],"tokens":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AmiiboFilter"}]}]}],"variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibofilter"]}],"identifier":{"interfaceLanguage":"swift","url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter"},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService"]]},"abstract":[{"type":"text","text":"A type that contains values to fine-tune a response when requesting amiibo items."}],"metadata":{"roleHeading":"Structure","modules":[{"name":"AmiiboService"}],"role":"symbol","title":"AmiiboFilter","externalID":"s:13AmiiboService0A6FilterV","symbolKind":"struct","navigatorTitle":[{"kind":"identifier","text":"AmiiboFilter"}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"kind":"identifier","text":"AmiiboFilter"}]},"schemaVersion":{"patch":0,"major":0,"minor":3},"kind":"symbol","topicSections":[{"identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/init(head:tail:identifier:name:type:series:gameCharacter:gameSeries:showGames:showUsage:)"],"anchor":"Initializers","generated":true,"title":"Initializers"},{"generated":true,"title":"Instance Properties","identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/gameCharacter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/gameSeries","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/head","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/identifier","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/name","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/series","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/showGames","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/showUsage","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/tail","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/type"],"anchor":"Instance-Properties"}],"relationshipsSections":[{"kind":"relationships","title":"Conforms To","identifiers":["doc:\/\/AmiiboService\/s8SendableP","doc:\/\/AmiiboService\/s16SendableMetatypeP"],"type":"conformsTo"}],"seeAlsoSections":[{"identifiers":["doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeriesFilter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboTypeFilter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameCharacterFilter","doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeriesFilter"],"generated":true,"anchor":"Filters","title":"Filters"}],"references":{"doc://AmiiboService/documentation/AmiiboService/AmiiboFilter/showUsage":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/showUsage","fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"showUsage"},{"text":": ","kind":"text"},{"text":"Bool","preciseIdentifier":"s:Sb","kind":"typeIdentifier"},{"kind":"text","text":"?"}],"abstract":[{"text":"A flag indicating whether to include amiibo usages in games in the response, if any.","type":"text"}],"kind":"symbol","type":"topic","role":"symbol","title":"showUsage","url":"\/documentation\/amiiboservice\/amiibofilter\/showusage"},"doc://AmiiboService/documentation/AmiiboService/GameSeriesFilter":{"type":"topic","identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/GameSeriesFilter","navigatorTitle":[{"text":"GameSeriesFilter","kind":"identifier"}],"kind":"symbol","url":"\/documentation\/amiiboservice\/gameseriesfilter","abstract":[{"text":"A type that contains values to fine-tune a response when requesting game series.","type":"text"}],"fragments":[{"text":"struct","kind":"keyword"},{"kind":"text","text":" "},{"text":"GameSeriesFilter","kind":"identifier"}],"title":"GameSeriesFilter","role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/AmiiboSeriesFilter":{"navigatorTitle":[{"kind":"identifier","text":"AmiiboSeriesFilter"}],"title":"AmiiboSeriesFilter","kind":"symbol","url":"\/documentation\/amiiboservice\/amiiboseriesfilter","fragments":[{"kind":"keyword","text":"struct"},{"text":" ","kind":"text"},{"kind":"identifier","text":"AmiiboSeriesFilter"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboSeriesFilter","type":"topic","abstract":[{"text":"A type that contains values to fine-tune a response when requesting amiibo series.","type":"text"}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService/AmiiboFilter/series":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/series","fragments":[{"text":"let","kind":"keyword"},{"kind":"text","text":" "},{"text":"series","kind":"identifier"},{"kind":"text","text":": "},{"kind":"typeIdentLine truncated
@@ -1 +0,0 @@
{"metadata":{"symbolKind":"property","role":"symbol","title":"gameCharacter","roleHeading":"Instance Property","modules":[{"name":"AmiiboService"}],"fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"gameCharacter"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","kind":"typeIdentifier","text":"String"},{"kind":"text","text":"?"}],"externalID":"s:13AmiiboService0A6FilterV13gameCharacterSSSgvp"},"identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/gameCharacter","interfaceLanguage":"swift"},"kind":"symbol","variants":[{"traits":[{"interfaceLanguage":"swift"}],"paths":["\/documentation\/amiiboservice\/amiibofilter\/gamecharacter"]}],"sections":[],"schemaVersion":{"major":0,"minor":3,"patch":0},"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter"]]},"abstract":[{"type":"text","text":"A game character to filter the result, if any."}],"primaryContentSections":[{"kind":"declarations","declarations":[{"platforms":["macOS"],"tokens":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"gameCharacter"},{"kind":"text","text":": "},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"kind":"text","text":"?"}],"languages":["swift"]}]}],"references":{"doc://AmiiboService/documentation/AmiiboService/AmiiboFilter/gameCharacter":{"title":"gameCharacter","kind":"symbol","url":"\/documentation\/amiiboservice\/amiibofilter\/gamecharacter","fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"gameCharacter"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"text":"?","kind":"text"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/gameCharacter","type":"topic","abstract":[{"text":"A game character to filter the result, if any.","type":"text"}],"role":"symbol"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"},"doc://AmiiboService/documentation/AmiiboService/AmiiboFilter":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter","kind":"symbol","role":"symbol","title":"AmiiboFilter","abstract":[{"type":"text","text":"A type that contains values to fine-tune a response when requesting amiibo items."}],"navigatorTitle":[{"kind":"identifier","text":"AmiiboFilter"}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"text":"AmiiboFilter","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibofilter","type":"topic"}}}
@@ -1 +0,0 @@
{"hierarchy":{"paths":[["doc:\/\/AmiiboService\/documentation\/AmiiboService","doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter"]]},"schemaVersion":{"major":0,"patch":0,"minor":3},"metadata":{"roleHeading":"Instance Property","modules":[{"name":"AmiiboService"}],"symbolKind":"property","externalID":"s:13AmiiboService0A6FilterV10gameSeriesSSSgvp","fragments":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"gameSeries","kind":"identifier"},{"text":": ","kind":"text"},{"kind":"typeIdentifier","text":"String","preciseIdentifier":"s:SS"},{"text":"?","kind":"text"}],"title":"gameSeries","role":"symbol"},"sections":[],"abstract":[{"type":"text","text":"A game series to filter the result, if any."}],"kind":"symbol","identifier":{"url":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/gameSeries","interfaceLanguage":"swift"},"variants":[{"paths":["\/documentation\/amiiboservice\/amiibofilter\/gameseries"],"traits":[{"interfaceLanguage":"swift"}]}],"primaryContentSections":[{"kind":"declarations","declarations":[{"languages":["swift"],"platforms":["macOS"],"tokens":[{"text":"let","kind":"keyword"},{"text":" ","kind":"text"},{"text":"gameSeries","kind":"identifier"},{"text":": ","kind":"text"},{"text":"String","kind":"typeIdentifier","preciseIdentifier":"s:SS"},{"kind":"text","text":"?"}]}]}],"references":{"doc://AmiiboService/documentation/AmiiboService/AmiiboFilter":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter","kind":"symbol","role":"symbol","title":"AmiiboFilter","abstract":[{"type":"text","text":"A type that contains values to fine-tune a response when requesting amiibo items."}],"navigatorTitle":[{"kind":"identifier","text":"AmiiboFilter"}],"fragments":[{"kind":"keyword","text":"struct"},{"kind":"text","text":" "},{"text":"AmiiboFilter","kind":"identifier"}],"url":"\/documentation\/amiiboservice\/amiibofilter","type":"topic"},"doc://AmiiboService/documentation/AmiiboService/AmiiboFilter/gameSeries":{"kind":"symbol","type":"topic","abstract":[{"text":"A game series to filter the result, if any.","type":"text"}],"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService\/AmiiboFilter\/gameSeries","url":"\/documentation\/amiiboservice\/amiibofilter\/gameseries","fragments":[{"kind":"keyword","text":"let"},{"kind":"text","text":" "},{"kind":"identifier","text":"gameSeries"},{"kind":"text","text":": "},{"preciseIdentifier":"s:SS","text":"String","kind":"typeIdentifier"},{"text":"?","kind":"text"}],"role":"symbol","title":"gameSeries"},"doc://AmiiboService/documentation/AmiiboService":{"identifier":"doc:\/\/AmiiboService\/documentation\/AmiiboService","abstract":[{"text":"A library that provides everything the developer needs to interact with the ","type":"text"},{"type":"strong","inlineContent":[{"type":"text","text":"Amiibo API"}]},{"type":"text","text":" backend service."}],"kind":"symbol","type":"topic","role":"collection","url":"\/documentation\/amiiboservice","title":"AmiiboService"}}}
Loaded 100 of 329 files, more files were not shown because too many files have changed in this diff. Show more