Remove value wrapper from CodableBridge (#151)

Fixes #32
This commit is contained in:
Sindre Sorhus 2023-10-04 17:58:57 +07:00 committed by GitHub
parent 55ec93004e
commit d8a9f51056
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 6 deletions

View File

@ -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)
}
}

View File

@ -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<Unicorn?>("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)