{"id":28267025,"url":"https://github.com/inekipelov/swift-codable-advance","last_synced_at":"2026-01-25T12:31:18.259Z","repository":{"id":292724910,"uuid":"981739685","full_name":"inekipelov/swift-codable-advance","owner":"inekipelov","description":"A library of extensions for Swift Codable protocols, simplifying the process of encoding and decoding objects.","archived":false,"fork":false,"pushed_at":"2025-08-18T18:07:02.000Z","size":61,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-18T19:09:23.180Z","etag":null,"topics":["codable","data","dictionary","json","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/inekipelov.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,"zenodo":null}},"created_at":"2025-05-11T19:29:33.000Z","updated_at":"2025-08-18T18:05:52.000Z","dependencies_parsed_at":"2025-08-07T17:30:54.328Z","dependency_job_id":"d4b32abf-6be2-4c3e-a887-b0c389e04f61","html_url":"https://github.com/inekipelov/swift-codable-advance","commit_stats":null,"previous_names":["inekipelov/swift-codable-advance"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/inekipelov/swift-codable-advance","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inekipelov%2Fswift-codable-advance","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inekipelov%2Fswift-codable-advance/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inekipelov%2Fswift-codable-advance/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inekipelov%2Fswift-codable-advance/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/inekipelov","download_url":"https://codeload.github.com/inekipelov/swift-codable-advance/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inekipelov%2Fswift-codable-advance/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28752965,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T10:25:12.305Z","status":"ssl_error","status_checked_at":"2026-01-25T10:25:11.933Z","response_time":113,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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","data","dictionary","json","swift"],"created_at":"2025-05-20T15:09:56.425Z","updated_at":"2026-01-25T12:31:18.253Z","avatar_url":"https://github.com/inekipelov.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CodableAdvance\n\n[![Swift Version](https://img.shields.io/badge/Swift-5.5+-orange.svg)](https://swift.org/)\n[![SPM](https://img.shields.io/badge/SPM-compatible-brightgreen.svg)](https://swift.org/package-manager/)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Swift Tests](https://github.com/inekipelov/swift-codable-advance/actions/workflows/swift.yml/badge.svg)](https://github.com/inekipelov/swift-codable-advance/actions/workflows/swift.yml)  \n[![iOS](https://img.shields.io/badge/iOS-13.0+-blue.svg)](https://developer.apple.com/ios/)\n[![macOS](https://img.shields.io/badge/macOS-10.15+-white.svg)](https://developer.apple.com/macos/)\n[![tvOS](https://img.shields.io/badge/tvOS-13.0+-black.svg)](https://developer.apple.com/tvos/)\n[![watchOS](https://img.shields.io/badge/watchOS-6.0+-orange.svg)](https://developer.apple.com/watchos/)\n\nA library of extensions for Swift Codable protocols, simplifying the process of encoding and decoding objects.\n\n## Installation\n\n### Swift Package Manager\n\nAdd the dependency to your `Package.swift`:\n\n```swift\ndependencies: [\n    .package(url: \"https://github.com/inekipelov/swift-codable-advance.git\", from: \"0.1.0\")\n]\n```\n\n## Usage Examples\n\n### Decoding from Data\n\n```swift\nimport CodableAdvance\n\nstruct User: Codable {\n    let id: Int\n    let name: String\n}\n\n// Decoding from String\nlet jsonString = \"\"\"\n{\n    \"id\": 1,\n    \"name\": \"John\"\n}\n\"\"\"\n\ndo {\n    let user = try User(string: jsonString)\n    print(user.name) // \"John\"\n} catch {\n    print(\"Decoding error: \\(error)\")\n}\n```\n\n### Decoding from Dictionary\n\n```swift\nlet dictionary: [String: Any] = [\"id\": 2, \"name\": \"Mary\"]\n\ndo {\n    let user = try User(dictionary: dictionary)\n    print(user.name) // \"Mary\"\n} catch {\n    print(\"Decoding error: \\(error)\")\n}\n\n// Or using the Dictionary extension\ndo {\n    let user: User = try dictionary.decode()\n    print(user.name) // \"Mary\"\n} catch {\n    print(\"Decoding error: \\(error)\")\n}\n```\n\n### Encoding to Data\n\n```swift\nlet user = User(id: 3, name: \"Alex\")\n\ndo {\n    let data = try user.encodedData()\n    // Use data for network transmission or storage\n} catch {\n    print(\"Encoding error: \\(error)\")\n}\n```\n\n### Encoding to Dictionary\n\n```swift\ndo {\n    let dict = try user.encodedDictionary()\n    print(dict[\"name\"] as? String) // \"Alex\"\n} catch {\n    print(\"Encoding error: \\(error)\")\n}\n```\n\n### Encoding Array to JSON String\n\n```swift\nlet users = [\n    User(id: 1, name: \"John\"),\n    User(id: 2, name: \"Mary\"),\n    User(id: 3, name: \"Alex\")\n]\n\n// Basic encoding to string\ndo {\n    let jsonString = try users.encodedString()\n    print(jsonString) // [{\"id\":1,\"name\":\"John\"},{\"id\":2,\"name\":\"Mary\"},{\"id\":3,\"name\":\"Alex\"}]\n} catch {\n    print(\"Encoding error: \\(error)\")\n}\n\n// Pretty-printing with custom encoder\ndo {\n    let prettyJsonString = try users.encodedString(\n        encoder: .outputFormatting(.prettyPrinted)\n    )\n    print(prettyJsonString)\n    // Output:\n    // [\n    //   {\n    //     \"id\": 1,\n    //     \"name\": \"John\"\n    //   },\n    //   {\n    //     \"id\": 2,\n    //     \"name\": \"Mary\"\n    //   },\n    //   {\n    //     \"id\": 3,\n    //     \"name\": \"Alex\"\n    //   }\n    // ]\n} catch {\n    print(\"Encoding error: \\(error)\")\n}\n\n// Using custom string encoding\ndo {\n    let asciiString = try users.encodedString(encoding: .ascii)\n    // Use ASCII-encoded string\n} catch {\n    print(\"Encoding error: \\(error)\")\n}\n```\n\n### Filtering Invalid Elements in Arrays\n\n#### Direct Array Decoding with Skip Invalid Option\n\n```swift\n// Some array elements are invalid\nlet invalidArrayJson = \"\"\"\n[\n    {\"id\": 1, \"name\": \"John\"},\n    {\"invalid\": true},\n    {\"id\": 2, \"name\": \"Mary\"}\n]\n\"\"\".data(using: .utf8)!\n\n// Option 1: Standard decoding (will throw on invalid elements)\ndo {\n    let users = try [User](data: invalidArrayJson)\n    print(users.count)\n} catch {\n    print(\"Decoding failed due to invalid elements: \\(error)\")\n}\n\n// Option 2: Skip invalid elements\ndo {\n    let users = try [User](data: invalidArrayJson, compactDecode: true)\n    print(users.count) // 2, invalid element is skipped\n    \n    // Users array only contains valid elements\n    users.forEach { user in\n        print(\"User: \\(user.name)\")\n    }\n} catch {\n    print(\"Decoding error: \\(error)\")\n}\n```\n\n#### Direct Access to CompactDecodeArray\n\n`CompactDecodeArray` struct allowing for more advanced use cases:\n\n```swift\n// Useful when you need direct access to the compact decoding mechanism\nlet decoder = JSONDecoder()\nlet compactArray = try decoder.decode(CompactDecodeArray\u003cUser\u003e.self, from: jsonData)\nlet validUsers = compactArray.elements\n\n// Or when you need to use it in your own container types\nstruct CustomContainer\u003cT: Decodable\u003e: Decodable {\n    let items: [T]\n    let metadata: String\n    \n    init(from decoder: Decoder) throws {\n        let container = try decoder.container(keyedBy: CodingKeys.self)\n        \n        // Use CompactDecodeArray directly to filter invalid items\n        let itemsContainer = try container.decode(CompactDecodeArray\u003cT\u003e.self, forKey: .items)\n        self.items = itemsContainer.elements\n        self.metadata = try container.decode(String.self, forKey: .metadata)\n    }\n    \n    enum CodingKeys: String, CodingKey {\n        case items, metadata\n    }\n}\n```\n\n## Fluent Interface for JSONEncoder and JSONDecoder\n\nCodableAdvance provides a fluent interface for configuring JSONEncoder and JSONDecoder, making it easier to set up encoding/decoding options:\n\n```swift\n// Configure JSONEncoder with method chaining\nlet encoder = JSONEncoder.dateEncodingStrategy(.iso8601)\n                         .dataEncodingStrategy(.base64)\n                         .outputFormatting(.prettyPrinted)\n\n// Configure JSONDecoder with method chaining\nlet decoder = JSONDecoder.dateDecodingStrategy(.iso8601)\n                         .dataDecodingStrategy(.base64)\n```\n\n## Enhanced String Encoding\n\n```swift\nlet users = [\n    User(id: 1, name: \"John\"),\n    User(id: 2, name: \"Mary\")\n]\n\n// Basic encoding to string\ndo {\n    let jsonString = try users.encodedString()\n    print(jsonString)\n} catch {\n    print(\"Encoding error: \\(error)\")\n}\n\n// Pretty-printing with sorted keys\ndo {\n    let prettyJsonString = try users.encodedString(encoder: \n        .outputFormatting(.prettyPrinted, .sortedKeys)\n    )\n    print(prettyJsonString)\n} catch {\n    print(\"Encoding error: \\(error)\")\n}\n\n// Using custom string encoding\ndo {\n    let asciiString = try users.encodedString(encoding: .ascii)\n    // Use ASCII-encoded string\n} catch {\n    print(\"Encoding error: \\(error)\")\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finekipelov%2Fswift-codable-advance","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finekipelov%2Fswift-codable-advance","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finekipelov%2Fswift-codable-advance/lists"}