From d8a9f5105607c85b544558e7f5b51d6c360ba88b Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 4 Oct 2023 17:58:57 +0700 Subject: [PATCH] Remove value wrapper from CodableBridge (#151) Fixes #32 --- Sources/Defaults/Defaults+Bridge.swift | 9 +++------ Tests/DefaultsTests/DefaultsCodableTests.swift | 13 +++++++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Sources/Defaults/Defaults+Bridge.swift b/Sources/Defaults/Defaults+Bridge.swift index 8ea2fe2..137020e 100644 --- a/Sources/Defaults/Defaults+Bridge.swift +++ b/Sources/Defaults/Defaults+Bridge.swift @@ -12,13 +12,10 @@ extension Defaults.CodableBridge { } do { - // Some codable values like URL and enum are encoded as a top-level - // string which JSON can't handle, so we need to wrap it in an array - // We need this: https://forums.swift.org/t/allowing-top-level-fragments-in-jsondecoder/11750 let jsonEncoder = JSONEncoder() jsonEncoder.outputFormatting = .sortedKeys - let data = try jsonEncoder.encode([value]) - return String(String(data: data, encoding: .utf8)!.dropFirst().dropLast()) + let data = try jsonEncoder.encode(value) + return String(data: data, encoding: .utf8) } catch { print(error) return nil @@ -30,7 +27,7 @@ extension Defaults.CodableBridge { return nil } - return [Value].init(jsonString: "[\(object)]")?.first + return Value(jsonString: object) } } diff --git a/Tests/DefaultsTests/DefaultsCodableTests.swift b/Tests/DefaultsTests/DefaultsCodableTests.swift index f70f5cd..18d3632 100644 --- a/Tests/DefaultsTests/DefaultsCodableTests.swift +++ b/Tests/DefaultsTests/DefaultsCodableTests.swift @@ -128,6 +128,19 @@ final class DefaultsCodableTests: XCTestCase { XCTAssertFalse(Defaults[key]["0"]?[1].isUnicorn ?? true) } + func testCodableAndRawRepresentable() { + struct Unicorn: Codable, RawRepresentable, Defaults.Serializable { + var rawValue: String + } + + let fixture = Unicorn(rawValue: "x") + + let key = Defaults.Key("independentKey_codableAndRawRepresentable") + Defaults[key] = fixture + XCTAssertEqual(Defaults[key]?.rawValue, fixture.rawValue) + XCTAssertEqual(UserDefaults.standard.string(forKey: key.name), #""\#(fixture.rawValue)""#) + } + func testType() { XCTAssertTrue(Defaults[.codable].isUnicorn) Defaults[.codable] = Unicorn(isUnicorn: false)