{"id":25082203,"url":"https://github.com/niksativa/codablekit","last_synced_at":"2025-04-01T10:23:53.146Z","repository":{"id":232897614,"uuid":"784159701","full_name":"NikSativa/CodableKit","owner":"NikSativa","description":"Swift library that provides additional features for Codable","archived":false,"fork":false,"pushed_at":"2024-09-29T15:53:47.000Z","size":14,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-07T05:33:54.427Z","etag":null,"topics":["codable","ios","optional","swift"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NikSativa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-09T09:55:26.000Z","updated_at":"2024-09-29T15:50:37.000Z","dependencies_parsed_at":"2024-04-12T06:00:27.814Z","dependency_job_id":"c37d4b75-eee1-415c-b734-0952c5391a4b","html_url":"https://github.com/NikSativa/CodableKit","commit_stats":null,"previous_names":["niksativa/codablekit"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NikSativa%2FCodableKit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NikSativa%2FCodableKit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NikSativa%2FCodableKit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NikSativa%2FCodableKit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NikSativa","download_url":"https://codeload.github.com/NikSativa/CodableKit/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246621278,"owners_count":20806925,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["codable","ios","optional","swift"],"created_at":"2025-02-07T05:29:06.491Z","updated_at":"2025-04-01T10:23:53.128Z","avatar_url":"https://github.com/NikSativa.png","language":"Swift","readme":"# CodableKit\n[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2FNikSativa%2FCodableKit%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/NikSativa/CodableKit)\n[![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2FNikSativa%2FCodableKit%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/NikSativa/CodableKit)\n\nSwift library that provides additional features for Codable. CodableKit is useful when you need to decode data from the server, but you are not sure that the data will be correct.\n\n## LossyValue\nAllows you to decode fields with a partially incorrect format or incorrect value. If the field is incorrect, the value will be nil. \n\n```swift\nenum Payment: String, Codable, Equatable {\n    case newCard = \"NewCard\"\n    case applePay = \"ApplePay\"\n}\n\nprivate struct WrappedUser: Codable, Equatable {\n    let name: String\n\n    @LossyValue\n    var payment: Payment? \u003c\u003c-------------- LossyValue behavior\n}\n\nprivate struct SDKUser: Codable, Equatable {\n    let name: String\n    let payment: Payment? \u003c\u003c-------------- SDK behavior\n}\n\nfunc test_when_decoding_data_is_valid() {\n    let json = [\n        \"name\": \"bob\",\n        \"payment\": \"NewCard\"\n    ]\n    let wrappedUser: WrappedUser? = subjectAction(json)\n    let expectedUser = WrappedUser(name: \"bob\", payment: .newCard)\n    XCTAssertEqual(wrappedUser, expectedUser)\n\n    let sdkUser: SDKUser? = subjectAction(json)\n    let expectedSdkUser = SDKUser(name: \"bob\", payment: .newCard)\n    XCTAssertEqual(sdkUser, expectedSdkUser)\n}\n\nfunc test_when_decoding_data_is_invalid() {\n    let json = [\n        \"name\": \"bob\",\n        \"payment\": \"GooglePay\"\n    ]\n    let wrappedUser: WrappedUser? = subjectAction(json)\n    let expectedUser = WrappedUser(name: \"bob\", payment: nil) \u003c\u003c-------------- LossyValue behavior\n    XCTAssertEqual(wrappedUser, expectedUser)\n\n    let sdkUser: SDKUser? = subjectAction(json) \u003c\u003c-------------- SDK behavior\n    XCTAssertNil(sdkUser)\n}\n\nfunc test_when_decoding_data_is_lack() {\n    let json = [\n        \"name\": \"bob\",\n        // payment field is required\n        \"other name of field\": \"NewCard\"\n    ]\n    let wrappedUser: WrappedUser? = subjectAction(json) \u003c\u003c-------------- LossyValue behavior\n    XCTAssertNil(wrappedUser)\n\n    let sdkUser: SDKUser? = subjectAction(json)\n    let expectedSdkUser = SDKUser(name: \"bob\", payment: nil) \u003c\u003c-------------- SDK behavior\n    XCTAssertEqual(sdkUser, expectedSdkUser)\n}\n```\n\n## LossyArray/LossyDictionary/LossySet\nAllows you to decode an array or dictionary with partially incorrect data. If the data is incorrect, the value will be omitted from the result.\n\n```swift\nprivate struct User: Decodable, Equatable {\n    enum Payment: String, Decodable, Equatable {\n        case newCard = \"NewCard\"\n        case applePay = \"ApplePay\"\n    }\n\n    let name: String\n\n    @LossyArray\n    var payments: [Payment]\n}\n\nlet subject: User? = subjectAction([\n    \"name\": \"bob\",\n    \"payments\": [\n        \"NewCard\", \"GooglePay\"\n    ]\n])\nlet expectedUser = User(name: \"bob\", payments: [.newCard]) \u003c\u003c-------------- unknown \"GooglePay\" is omitted\nXCTAssertEqual(subject, expectedUser)\n```\n\n## Nullable\nAllows you to encode 'nil' field as 'null' in JSON when server requires it.\n\n```swift\nprivate struct User: Encodable, Equatable {\n    enum Payment: String, Encodable, Equatable {\n        case newCard = \"NewCard\"\n        case applePay = \"ApplePay\"\n    }\n\n    let name: String\n\n    @Nullable\n    var payments: Payment?\n\n    /// absent in JSON when value is `nil`\n    var payments2: Payment?\n}\n\nfunc test_common() throws {\n    let subject: User = .init(name: \"bob\",\n                              payments: .applePay,\n                              payments2: nil)\n    let data = try Data.make(from: subject)\n    let str = String(data: data, encoding: .utf8)\n    let expected =\n        \"\"\"\n        {\n          \"name\" : \"bob\",\n          \"payments\" : \"ApplePay\"\n        }\n        \"\"\"\n    XCTAssertEqual(str, expected, str ?? \"\")\n}\n\nfunc test_null() throws {\n    let subject: User = .init(name: \"bob\",\n                              payments: nil,\n                              payments2: nil)\n    let data = try Data.make(from: subject)\n    let str = String(data: data, encoding: .utf8)\n    let expected =\n        \"\"\"\n        {\n          \"name\" : \"bob\",\n          \"payments\" : null  \u003c\u003c-------------- `null` instead of absent\n        }\n        \"\"\"\n    XCTAssertEqual(str, expected, str ?? \"\")\n}    \n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fniksativa%2Fcodablekit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fniksativa%2Fcodablekit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fniksativa%2Fcodablekit/lists"}