diff --git a/Sources/LMStorage/LMCodable.swift b/Sources/LMStorage/LMCodable.swift index d24ecb0..bcfab5d 100644 --- a/Sources/LMStorage/LMCodable.swift +++ b/Sources/LMStorage/LMCodable.swift @@ -137,6 +137,15 @@ extension LMCodable { } return [] } + + /// Returns an optional `LMJSONOptional` if the serialization is successful; otherwise, returns `nil`. + public func dictionaryNullable() -> LMJSONOptional? { + if let jsonData = data(), + let result = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? LMJSONOptional { + return result + } + return nil + } } extension Encodable { diff --git a/Tests/LMStorageTests/LMCodableTests.swift b/Tests/LMStorageTests/LMCodableTests.swift index 4d69a29..cbad2c0 100644 --- a/Tests/LMStorageTests/LMCodableTests.swift +++ b/Tests/LMStorageTests/LMCodableTests.swift @@ -87,4 +87,19 @@ final class LMCodableTests: XCTestCase { XCTAssertEqual(movies.first?.title, "Black Panther") XCTAssertEqual(movies.last?.title, "Iron Man") } + + func testParseNullable() { + let contet = ContentId(id: "Movie-ID", seriesTmdb: nil, source: "Amazon Prime") + let dict = contet.dictionaryNullable() + let dictionaryItens = 3 + let keys: [String] = ["id", "seriesTmdb", "source"] + + var itemsCount = 0 + dict?.forEach { key, _ in + itemsCount += 1 + XCTAssertTrue(keys.contains { $0 == key }) + } + + XCTAssertEqual(dictionaryItens, itemsCount) + } } diff --git a/Tests/LMStorageTests/Mock/ContentId.swift b/Tests/LMStorageTests/Mock/ContentId.swift new file mode 100644 index 0000000..7453868 --- /dev/null +++ b/Tests/LMStorageTests/Mock/ContentId.swift @@ -0,0 +1,27 @@ +// +// ContentId.swift +// LMStorage +// +// Created by Paulo Henrique Oliveira Souza on 17/06/25. +// + +@testable import LMStorage + +struct ContentId: LMCodable { + var id: String? + var seriesTmdb: String? + var source: String? + + enum CodingKeys: String, CodingKey { + case id = "id" + case seriesTmdb = "seriesTmdb" + case source = "source" + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(id, forKey: .id) + try container.encode(seriesTmdb, forKey: .seriesTmdb) + try container.encode(source, forKey: .source) + } +}