# ``MarvelService`` A library that allows the developer to interact with the **Marvel Comics API** backend service. ## Overview The **MarvelService** library is a package that allows the developer to interact with all the available endpoints of the [Marvel Comics online service](https://developer.marvel.com). ## Installation This library can be integrated into your library, tool, and/or app as an added dependency into any `Package.swift` file or Xcode project with the [Swift Package Manager](https://developer.apple.com/documentation/xcode/swift-packages). Here's an example of how to add this library as a dependency into a `Package.swift` file: ```swift let package = Package( // name, platforms, products, etc. dependencies: [ .package(url: "https://github.com/rock-n-code/marvel-service", from: "1.1.0"), // other dependencies ], targets: [ .target( name: "SomeTarget", dependencies: [ .product(name: "MarvelService", package: "marvel-service"), ] ) // other targets ] ) ``` In [Xcode](https://developer.apple.com/xcode/), on the other hand, it is required to use the Xcode inerface to add dependencies into a project or workspace. > important: Swift 5.10 or higher is required in order to build this library. ## Usage After adding the `MarvelService` library as a dependency in the library, tool, and/or application, as explained in the previous sec tion, then it is required to import the library. ```swift import MarvelService ``` Then a ``Client`` must to be initialized. Although this type is highly configurable, and browsing through its documentation is highly recomendable; it requires three parameters to set the client correctly: 1. *a host URL to which the client connects to*; 2. *a transport in charge of performing the HTTP operations*; 3. *an authorization middleware configured with either an `api key` or a `private+public` keys*. ```swift let marvelClient = Client( serverURL: try Servers.Server1.url(), transport: URLSessionTransport(), middlewares: [ AuthMiddleware( privateKey: "SomePrivateKey", publicKey: "SomePublicKey" ) ] ) ``` > Important: It is mandatory to signup to the [Developer portal of Marvel Comics](https://developer.marvel.com/account) in order to obtain an *API Key* to use this library, as every request to this service [requires to be signed](https://developer.marvel.com/documentation/authorization). Finally a client is ready to use! This client is now able to request any information regarding to any published Marvel *characters, comics, creators, events, series and stories* to the **Marvel Comics API** service, and handle its responses as follows: ```swift do { let response = try await marvelClient.getCharacters( query: .init(name: "wolverine"), ) switch response { case let .ok(ok): switch ok.body { case let .json(charactersContainer): // Do something with the `charactersContainer` object. } case let .unauthorized(standardError): // Do something with the `standardError` object. case .forbidden(_): // Do something here, like throwing an error. case let .notFound(standardError): // Do something with the `standardError` object. case let .methodNotAllowed(_): // Do something here, like throwing an error. case let .conflict(standardError): // Do something with the `standardError` object. case let .tooManyRequests(_): // Do something here, like throwing an error. case let .undocumented(statusCode, payload): // Do something with the `statusCode` and `payload` received from undeclared response, if required. } } catch { // Do something with any catched error. } ``` > Tip: It is highly recommended to go through the available documentation at the [Marvel Comics online service](https://developer.marvel.com) > Warning: Please do create an issue in case of encountering problems interacting with any of the endpoints. ## Tasks 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. > Tip: To show the available list of tasks, plus display some explanations about each and every one of them; please enter the following command: ```bash $ make ``` ## Topics ### Client - ``Client`` ### Configuration - ``Servers/Server1`` - ``AuthMiddleware`` ### Core Entity Containers - ``Components/Schemas/CharacterDataContainer`` - ``Components/Schemas/ComicDataContainer`` - ``Components/Schemas/CreatorDataContainer`` - ``Components/Schemas/EventDataContainer`` - ``Components/Schemas/SeriesDataContainer`` - ``Components/Schemas/StoryDataContainer`` ### Core Entity Wrappers - ``Components/Schemas/CharacterDataWrapper`` - ``Components/Schemas/ComicDataWrapper`` - ``Components/Schemas/CreatorDataWrapper`` - ``Components/Schemas/EventDataWrapper`` - ``Components/Schemas/SeriesDataWrapper`` - ``Components/Schemas/StoryDataWrapper`` ### Core Entity List - ``Components/Schemas/CharacterList`` - ``Components/Schemas/ComicList`` - ``Components/Schemas/CreatorList`` - ``Components/Schemas/EventList`` - ``Components/Schemas/SeriesList`` - ``Components/Schemas/StoryList`` ### Core Entity Summaries - ``Components/Schemas/CharacterSummary`` - ``Components/Schemas/ComicSummary`` - ``Components/Schemas/CreatorSummary`` - ``Components/Schemas/EventSummary`` - ``Components/Schemas/SeriesSummary`` - ``Components/Schemas/StorySummary`` ### Core Entities - ``Components/Schemas/Character`` - ``Components/Schemas/Comic`` - ``Components/Schemas/Creator`` - ``Components/Schemas/Event`` - ``Components/Schemas/Series`` - ``Components/Schemas/Story`` ### Common Types - ``Components/Schemas/ComicDate`` - ``Components/Schemas/ComicPrice`` - ``Components/Schemas/Image`` - ``Components/Schemas/TextObject`` - ``Components/Schemas/Url`` ### Error Types - ``Components/Schemas/StandardError`` ### Namespaces - ``Components`` - ``Operations`` - ``Servers`` ### Protocols - ``APIProtocol``