A little renaming and easier access to important types under the JSONAPIDocument protocol

This commit is contained in:
Mathew Polzin
2018-11-27 18:20:01 -08:00
parent e36180c9b9
commit 661ff6eca5
3 changed files with 32 additions and 19 deletions
@@ -47,3 +47,13 @@ if case let .data(bodyData) = peopleResponse.body {
} else {
print("no body data")
}
// MARK: - Work in the abstract
func process<T: JSONAPIDocument>(document: T) {
guard case let .data(body) = document.body else {
return
}
let x: T.BodyData = body
}
process(document: peopleResponse)
+19 -16
View File
@@ -6,13 +6,16 @@
//
public protocol JSONAPIDocument: Codable, Equatable {
associatedtype ResourceBody: JSONAPI.ResourceBody
associatedtype PrimaryResourceBody: JSONAPI.ResourceBody
associatedtype MetaType: JSONAPI.Meta
associatedtype LinksType: JSONAPI.Links
associatedtype IncludeType: JSONAPI.Include
associatedtype Error: JSONAPIError
var body: Document<ResourceBody, MetaType, LinksType, IncludeType, Error>.Body { get }
typealias Body = Document<PrimaryResourceBody, MetaType, LinksType, IncludeType, Error>.Body
typealias BodyData = Body.Data
var body: Body { get }
}
/// A JSON API Document represents the entire body
@@ -22,7 +25,7 @@ public protocol JSONAPIDocument: Codable, Equatable {
/// API uses snake case, you will want to use
/// a conversion such as the one offerred by the
/// Foundation JSONEncoder/Decoder: `KeyDecodingStrategy`
public struct Document<ResourceBody: JSONAPI.ResourceBody, MetaType: JSONAPI.Meta, LinksType: JSONAPI.Links, IncludeType: JSONAPI.Include, Error: JSONAPIError>: JSONAPIDocument {
public struct Document<PrimaryResourceBody: JSONAPI.ResourceBody, MetaType: JSONAPI.Meta, LinksType: JSONAPI.Links, IncludeType: JSONAPI.Include, Error: JSONAPIError>: JSONAPIDocument {
public typealias Include = IncludeType
public let body: Body
@@ -33,7 +36,7 @@ public struct Document<ResourceBody: JSONAPI.ResourceBody, MetaType: JSONAPI.Met
case data(Data)
public struct Data: Equatable {
public let primary: ResourceBody
public let primary: PrimaryResourceBody
public let includes: Includes<Include>
public let meta: MetaType
public let links: LinksType
@@ -49,7 +52,7 @@ public struct Document<ResourceBody: JSONAPI.ResourceBody, MetaType: JSONAPI.Met
return errors
}
public var primaryData: ResourceBody? {
public var primaryData: PrimaryResourceBody? {
guard case let .data(data) = self else { return nil }
return data.primary
}
@@ -86,49 +89,49 @@ public struct Document<ResourceBody: JSONAPI.ResourceBody, MetaType: JSONAPI.Met
body = .errors(errors, meta: meta, links: links)
}
public init(body: ResourceBody, includes: Includes<Include>, meta: MetaType, links: LinksType) {
public init(body: PrimaryResourceBody, includes: Includes<Include>, meta: MetaType, links: LinksType) {
self.body = .data(.init(primary: body, includes: includes, meta: meta, links: links))
}
}
extension Document where IncludeType == NoIncludes {
public init(body: ResourceBody, meta: MetaType, links: LinksType) {
public init(body: PrimaryResourceBody, meta: MetaType, links: LinksType) {
self.body = .data(.init(primary: body, includes: .none, meta: meta, links: links))
}
}
extension Document where MetaType == NoMetadata {
public init(body: ResourceBody, includes: Includes<Include>, links: LinksType) {
public init(body: PrimaryResourceBody, includes: Includes<Include>, links: LinksType) {
self.body = .data(.init(primary: body, includes: includes, meta: .none, links: links))
}
}
extension Document where LinksType == NoLinks {
public init(body: ResourceBody, includes: Includes<Include>, meta: MetaType) {
public init(body: PrimaryResourceBody, includes: Includes<Include>, meta: MetaType) {
self.body = .data(.init(primary: body, includes: includes, meta: meta, links: .none))
}
}
extension Document where IncludeType == NoIncludes, LinksType == NoLinks {
public init(body: ResourceBody, meta: MetaType) {
public init(body: PrimaryResourceBody, meta: MetaType) {
self.body = .data(.init(primary: body, includes: .none, meta: meta, links: .none))
}
}
extension Document where IncludeType == NoIncludes, MetaType == NoMetadata {
public init(body: ResourceBody, links: LinksType) {
public init(body: PrimaryResourceBody, links: LinksType) {
self.body = .data(.init(primary: body, includes: .none, meta: .none, links: links))
}
}
extension Document where MetaType == NoMetadata, LinksType == NoLinks {
public init(body: ResourceBody, includes: Includes<Include>) {
public init(body: PrimaryResourceBody, includes: Includes<Include>) {
self.body = .data(.init(primary: body, includes: includes, meta: .none, links: .none))
}
}
extension Document where IncludeType == NoIncludes, MetaType == NoMetadata, LinksType == NoLinks {
public init(body: ResourceBody) {
public init(body: PrimaryResourceBody) {
self.body = .data(.init(primary: body, includes: .none, meta: .none, links: .none))
}
}
@@ -176,11 +179,11 @@ extension Document {
return
}
let data: ResourceBody
if let noData = NoResourceBody() as? ResourceBody {
let data: PrimaryResourceBody
if let noData = NoResourceBody() as? PrimaryResourceBody {
data = noData
} else {
data = try container.decode(ResourceBody.self, forKey: .data)
data = try container.decode(PrimaryResourceBody.self, forKey: .data)
}
let maybeIncludes = try container.decodeIfPresent(Includes<Include>.self, forKey: .included)
+3 -3
View File
@@ -1,5 +1,5 @@
//
// ResourceBody.swift
// PrimaryResourceBody.swift
// JSONAPI
//
// Created by Mathew Polzin on 11/10/18.
@@ -80,12 +80,12 @@ extension ManyResourceBody {
extension SingleResourceBody: CustomStringConvertible {
public var description: String {
return "ResourceBody(\(String(describing: value)))"
return "PrimaryResourceBody(\(String(describing: value)))"
}
}
extension ManyResourceBody: CustomStringConvertible {
public var description: String {
return "ResourceBody(\(String(describing: values)))"
return "PrimaryResourceBody(\(String(describing: values)))"
}
}