Skip to content

Commit 83cf5bb

Browse files
committed
allow optional metadata to be omitted as well as nulled out.
1 parent 3856a88 commit 83cf5bb

3 files changed

Lines changed: 31 additions & 6 deletions

File tree

Sources/JSONAPI/Resource/Relationship.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,6 @@ extension MetaRelationship: Codable {
263263
}
264264
}
265265

266-
fileprivate protocol _Optional {}
267-
extension Optional: _Optional {}
268-
269266
extension ToOneRelationship: Codable where Identifiable.ID: OptionalId {
270267
public init(from decoder: Decoder) throws {
271268
let container = try decoder.container(keyedBy: ResourceLinkageCodingKeys.self)

Sources/JSONAPI/Resource/Resource Object/ResourceObject.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,17 @@ public extension ResourceObject {
447447
)
448448
}
449449

450-
meta = try (NoMetadata() as? MetaType) ?? container.decode(MetaType.self, forKey: .meta)
450+
do {
451+
meta = try (NoMetadata() as? MetaType) ?? container.decode(MetaType.self, forKey: .meta)
452+
} catch let decodingError as DecodingError {
453+
let anyNil: Any? = nil
454+
455+
guard case .keyNotFound = decodingError,
456+
let omittedMeta = anyNil as? MetaType else {
457+
throw decodingError
458+
}
459+
meta = omittedMeta
460+
}
451461

452462
links = try (NoLinks() as? LinksType) ?? container.decode(LinksType.self, forKey: .links)
453463
}

Tests/JSONAPITests/ResourceObject/ResourceObjectTests.swift

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,11 @@ extension ResourceObjectTests {
151151
data: entity_no_relationships_no_attributes)
152152
}
153153

154+
func test_EntityNoMetaDecodesAsOptionalMeta() {
155+
let _ = decoded(type: TestEntityOptionalMeta.self,
156+
data: entity_no_relationships_no_attributes)
157+
}
158+
154159
func test_EntityNoRelationshipsSomeAttributes() {
155160
let entity = decoded(type: TestEntity5.self,
156161
data: entity_no_relationships_some_attributes)
@@ -861,13 +866,13 @@ extension ResourceObjectTests {
861866

862867
public struct Relationships: JSONAPI.Relationships {
863868
public init() {
864-
optionalMeta = nil
869+
optionalMeta = nil
865870
optionalOne = nil
866871
optionalNullableOne = nil
867872
optionalMany = nil
868873
}
869874

870-
let optionalMeta: MetaRelationship<TestEntityMeta, NoLinks>?
875+
let optionalMeta: MetaRelationship<TestEntityMeta, NoLinks>?
871876

872877
let optionalOne: ToOneRelationship<TestEntity1, NoIdMetadata, NoMetadata, NoLinks>?
873878

@@ -879,6 +884,19 @@ extension ResourceObjectTests {
879884

880885
typealias TestEntity12 = BasicEntity<TestEntityType12>
881886

887+
enum TestEntityOptionalMetaType: JSONAPI.ResourceObjectDescription {
888+
public static var jsonType: String { return "test_entities" }
889+
890+
typealias Attributes = NoAttributes
891+
typealias Relationships = NoRelationships
892+
}
893+
894+
struct UnimportantMeta: JSONAPI.Meta {
895+
let property1: String
896+
}
897+
898+
typealias TestEntityOptionalMeta = JSONAPI.ResourceObject<TestEntityOptionalMetaType, UnimportantMeta?, NoLinks, String>
899+
882900
enum UnidentifiedTestEntityType: ResourceObjectDescription {
883901
public static var jsonType: String { return "unidentified_test_entities" }
884902

0 commit comments

Comments
 (0)