Skip to content

Commit 8e811d7

Browse files
authored
fix String <-> Data (#6952)
String(data:encoding)? -> String(decoding:as) String.data(using)? -> Data(String.utf8)
1 parent 7c1cbeb commit 8e811d7

File tree

21 files changed

+78
-99
lines changed

21 files changed

+78
-99
lines changed

Sources/Basics/AuthorizationProvider.swift

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ public protocol AuthorizationWriter {
3737
public enum AuthorizationProviderError: Error {
3838
case invalidURLHost
3939
case notFound
40-
case cannotEncodePassword
4140
case other(String)
4241
}
4342

@@ -48,9 +47,7 @@ extension AuthorizationProvider {
4847
return nil
4948
}
5049
let authString = "\(user):\(password)"
51-
guard let authData = authString.data(using: .utf8) else {
52-
return nil
53-
}
50+
let authData = Data(authString.utf8)
5451
return "Basic \(authData.base64EncodedString())"
5552
}
5653
}
@@ -207,9 +204,7 @@ public class KeychainAuthorizationProvider: AuthorizationProvider, Authorization
207204
return callback(.success(()))
208205
}
209206

210-
guard let passwordData = password.data(using: .utf8) else {
211-
return callback(.failure(AuthorizationProviderError.cannotEncodePassword))
212-
}
207+
let passwordData = Data(password.utf8)
213208

214209
do {
215210
if !(try self.update(protocolHostPort: protocolHostPort, account: user, password: passwordData)) {
@@ -290,12 +285,13 @@ public class KeychainAuthorizationProvider: AuthorizationProvider, Authorization
290285
modified: mostRecent[kSecAttrModificationDate as String] as? Date
291286
) as? [String: Any],
292287
let passwordData = existingItem[kSecValueData as String] as? Data,
293-
let password = String(data: passwordData, encoding: String.Encoding.utf8),
294288
let account = existingItem[kSecAttrAccount as String] as? String
295289
else {
296290
throw AuthorizationProviderError
297291
.other("Failed to extract credentials for '\(protocolHostPort)' from keychain")
298292
}
293+
294+
let password = String(decoding: passwordData, as: UTF8.self)
299295

300296
return (user: account, password: password)
301297
} catch {

Sources/Basics/HTTPClient/HTTPClientResponse.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,18 @@ public struct HTTPClientResponse: Sendable {
3737

3838
extension HTTPClientResponse {
3939
public static func okay(body: String? = nil) -> HTTPClientResponse {
40-
.okay(body: body?.data(using: .utf8))
40+
.okay(body: body.map { Data($0.utf8) })
4141
}
4242

4343
public static func okay(body: Data?) -> HTTPClientResponse {
4444
HTTPClientResponse(statusCode: 200, body: body)
4545
}
4646

4747
public static func notFound(reason: String? = nil) -> HTTPClientResponse {
48-
HTTPClientResponse(statusCode: 404, body: (reason ?? "Not Found").data(using: .utf8))
48+
HTTPClientResponse(statusCode: 404, body: Data((reason ?? "Not Found").utf8))
4949
}
5050

5151
public static func serverError(reason: String? = nil) -> HTTPClientResponse {
52-
HTTPClientResponse(statusCode: 500, body: (reason ?? "Internal Server Error").data(using: .utf8))
52+
HTTPClientResponse(statusCode: 500, body: Data((reason ?? "Internal Server Error").utf8))
5353
}
5454
}

Sources/Basics/JSONDecoder+Extensions.swift

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,7 @@ import Foundation
1414

1515
extension JSONDecoder {
1616
public func decode<T>(_ type: T.Type, from string: String) throws -> T where T: Decodable {
17-
guard let data = string.data(using: .utf8) else {
18-
let context = DecodingError.Context(codingPath: [], debugDescription: "invalid UTF-8 string")
19-
throw DecodingError.dataCorrupted(context)
20-
}
21-
17+
let data = Data(string.utf8)
2218
return try self.decode(type, from: data)
2319
}
2420
}

Sources/Commands/PackageTools/DumpCommands.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ struct DumpPackage: SwiftCommand {
112112
encoder.userInfo[Manifest.dumpPackageKey] = true
113113

114114
let jsonData = try encoder.encode(rootManifest)
115-
let jsonString = String(data: jsonData, encoding: .utf8)!
115+
let jsonString = String(decoding: jsonData, as: UTF8.self)
116116
print(jsonString)
117117
}
118118
}

Sources/LLBuildManifest/BuildManifest.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,7 @@ public enum WriteAuxiliary {
117117
encoder.outputFormat = .xml
118118
let result = try encoder.encode(plist)
119119

120-
guard let contents = String(data: result, encoding: .utf8) else {
121-
throw Error.invalidPropertyListData
122-
}
120+
let contents = String(decoding: result, as: UTF8.self)
123121
return contents
124122
}
125123

@@ -128,7 +126,6 @@ public enum WriteAuxiliary {
128126
}
129127

130128
private enum Error: Swift.Error {
131-
case invalidPropertyListData
132129
case undefinedPrincipalClass
133130
}
134131
}

Sources/PackageCollectionsSigning/PackageCollectionSigning.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,7 @@ public actor PackageCollectionSigning: PackageCollectionSigner, PackageCollectio
239239
signedCollection: Model.SignedCollection,
240240
certPolicyKey: CertificatePolicyKey = .default
241241
) async throws {
242-
guard let signatureBytes = signedCollection.signature.signature.data(using: .utf8)?.copyBytes() else {
243-
throw PackageCollectionSigningError.invalidSignature
244-
}
242+
let signatureBytes = Data(signedCollection.signature.signature.utf8).copyBytes()
245243

246244
// Parse the signature
247245
let certChainValidate = { certChainData in

Sources/PackageCollectionsTool/SwiftPackageCollectionsTool.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ private func optionalRow(_ title: String, _ contents: String?, indentationLevel:
380380
private extension JSONEncoder {
381381
func print<T>(_ value: T) throws where T: Encodable {
382382
let jsonData = try self.encode(value)
383-
let jsonString = String(data: jsonData, encoding: .utf8)!
383+
let jsonString = String(decoding: jsonData, as: UTF8.self)
384384
Swift.print(jsonString)
385385
}
386386
}

Sources/PackageDescription/PackageDescription.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ private func manifestToJSON(_ package: Package) -> String {
442442
let encoder = JSONEncoder()
443443
encoder.outputFormatting = [.sortedKeys, .withoutEscapingSlashes]
444444
let data = try! encoder.encode(Output(package: .init(package), errors: errors, version: 2))
445-
return String(data: data, encoding: .utf8)!
445+
return String(decoding: data, as: UTF8.self)
446446
}
447447

448448
var errors: [String] = []

Sources/PackageLoading/ContextModel.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,15 @@ extension ContextModel : Codable {
2828
func encode() throws -> String {
2929
let encoder = JSONEncoder()
3030
let data = try encoder.encode(self)
31-
return String(data: data, encoding: .utf8)!
31+
return String(decoding: data, as: UTF8.self)
3232
}
3333

3434
static func decode() throws -> ContextModel {
3535
var args = Array(ProcessInfo.processInfo.arguments[1...]).makeIterator()
3636
while let arg = args.next() {
3737
if arg == "-context", let json = args.next() {
3838
let decoder = JSONDecoder()
39-
guard let data = json.data(using: .utf8) else {
40-
throw StringError(description: "Failed decoding context json as UTF8")
41-
}
39+
let data = Data(json.utf8)
4240
return try decoder.decode(ContextModel.self, from: data)
4341
}
4442
}

Sources/PackageRegistry/RegistryClient.swift

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,7 @@ public final class RegistryClient: Cancellable {
8686
switch registryAuthentication.type {
8787
case .basic:
8888
let authorizationString = "\(user):\(password)"
89-
guard let authorizationData = authorizationString.data(using: .utf8) else {
90-
return nil
91-
}
89+
let authorizationData = Data(authorizationString.utf8)
9290
return "Basic \(authorizationData.base64EncodedString())"
9391
case .token: // `user` value is irrelevant in this case
9492
return "Bearer \(password)"
@@ -592,9 +590,7 @@ public final class RegistryClient: Cancellable {
592590
guard let data = response.body else {
593591
throw RegistryError.invalidResponse
594592
}
595-
guard let manifestContent = String(data: data, encoding: .utf8) else {
596-
throw RegistryError.invalidResponse
597-
}
593+
let manifestContent = String(decoding: data, as: UTF8.self)
598594

599595
signatureValidation.validate(
600596
registry: registry,
@@ -830,9 +826,7 @@ public final class RegistryClient: Cancellable {
830826
guard let data = response.body else {
831827
throw RegistryError.invalidResponse
832828
}
833-
guard let manifestContent = String(data: data, encoding: .utf8) else {
834-
throw RegistryError.invalidResponse
835-
}
829+
let manifestContent = String(decoding: data, as: UTF8.self)
836830

837831
signatureValidation.validate(
838832
registry: registry,
@@ -1614,14 +1608,14 @@ public final class RegistryClient: Cancellable {
16141608
case 400...499:
16151609
return RegistryError.clientError(
16161610
code: response.statusCode,
1617-
details: response.body.flatMap { String(data: $0, encoding: .utf8) } ?? ""
1611+
details: response.body.map { String(decoding: $0, as: UTF8.self) } ?? ""
16181612
)
16191613
case 501:
16201614
return RegistryError.authenticationMethodNotSupported
16211615
case 500...599:
16221616
return RegistryError.serverError(
16231617
code: response.statusCode,
1624-
details: response.body.flatMap { String(data: $0, encoding: .utf8) } ?? ""
1618+
details: response.body.map { String(decoding: $0, as: UTF8.self) } ?? ""
16251619
)
16261620
default:
16271621
return RegistryError.invalidResponseStatus(expected: expectedStatus, actual: response.statusCode)

Sources/XCBuildSupport/PIFBuilder.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public final class PIFBuilder {
9797
try PIF.sign(topLevelObject.workspace)
9898

9999
let pifData = try encoder.encode(topLevelObject)
100-
return String(data: pifData, encoding: .utf8)!
100+
return String(decoding: pifData, as: UTF8.self)
101101
}
102102

103103
/// Constructs a `PIF.TopLevelObject` representing the package graph.

Tests/BasicsTests/AuthorizationProviderTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ final class AuthorizationProviderTests: XCTestCase {
274274
XCTAssertEqual(authentication?.password, expected.password)
275275
XCTAssertEqual(
276276
provider.httpAuthorizationHeader(for: url),
277-
"Basic " + "\(expected.user):\(expected.password)".data(using: .utf8)!.base64EncodedString()
277+
"Basic " + Data("\(expected.user):\(expected.password)".utf8).base64EncodedString()
278278
)
279279
}
280280
}

Tests/BasicsTests/HTTPClientTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ final class HTTPClientTests: XCTestCase {
4040
let requestHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
4141
let responseStatus = Int.random(in: 201 ..< 500)
4242
let responseHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
43-
let responseBody = UUID().uuidString.data(using: .utf8)
43+
let responseBody = Data(UUID().uuidString.utf8)
4444

4545
let httpClient = HTTPClient { request, _ in
4646
XCTAssertEqual(request.url, url, "url should match")
@@ -58,10 +58,10 @@ final class HTTPClientTests: XCTestCase {
5858
func testPost() async throws {
5959
let url = URL("http://test")
6060
let requestHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
61-
let requestBody = UUID().uuidString.data(using: .utf8)
61+
let requestBody = Data(UUID().uuidString.utf8)
6262
let responseStatus = Int.random(in: 201 ..< 500)
6363
let responseHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
64-
let responseBody = UUID().uuidString.data(using: .utf8)
64+
let responseBody = Data(UUID().uuidString.utf8)
6565

6666
let httpClient = HTTPClient { request, _ in
6767
XCTAssertEqual(request.url, url, "url should match")
@@ -80,10 +80,10 @@ final class HTTPClientTests: XCTestCase {
8080
func testPut() async throws {
8181
let url = URL("http://test")
8282
let requestHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
83-
let requestBody = UUID().uuidString.data(using: .utf8)
83+
let requestBody = Data(UUID().uuidString.utf8)
8484
let responseStatus = Int.random(in: 201 ..< 500)
8585
let responseHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
86-
let responseBody = UUID().uuidString.data(using: .utf8)
86+
let responseBody = Data(UUID().uuidString.utf8)
8787

8888
let httpClient = HTTPClient { request, _ in
8989
XCTAssertEqual(request.url, url, "url should match")
@@ -104,7 +104,7 @@ final class HTTPClientTests: XCTestCase {
104104
let requestHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
105105
let responseStatus = Int.random(in: 201 ..< 500)
106106
let responseHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
107-
let responseBody = UUID().uuidString.data(using: .utf8)
107+
let responseBody = Data(UUID().uuidString.utf8)
108108

109109
let httpClient = HTTPClient { request, _ in
110110
XCTAssertEqual(request.url, url, "url should match")

Tests/BasicsTests/LegacyHTTPClientTests.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ final class LegacyHTTPClientTests: XCTestCase {
5252
let requestHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
5353
let responseStatus = Int.random(in: 201 ..< 500)
5454
let responseHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
55-
let responseBody = UUID().uuidString.data(using: .utf8)
55+
let responseBody = Data(UUID().uuidString.utf8)
5656

5757
let handler: LegacyHTTPClient.Handler = { request, _, completion in
5858
XCTAssertEqual(request.url, url, "url should match")
@@ -82,10 +82,10 @@ final class LegacyHTTPClientTests: XCTestCase {
8282
func testPost() {
8383
let url = URL("http://test")
8484
let requestHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
85-
let requestBody = UUID().uuidString.data(using: .utf8)
85+
let requestBody = Data(UUID().uuidString.utf8)
8686
let responseStatus = Int.random(in: 201 ..< 500)
8787
let responseHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
88-
let responseBody = UUID().uuidString.data(using: .utf8)
88+
let responseBody = Data(UUID().uuidString.utf8)
8989

9090
let handler: LegacyHTTPClient.Handler = { request, _, completion in
9191
XCTAssertEqual(request.url, url, "url should match")
@@ -116,10 +116,10 @@ final class LegacyHTTPClientTests: XCTestCase {
116116
func testPut() {
117117
let url = URL("http://test")
118118
let requestHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
119-
let requestBody = UUID().uuidString.data(using: .utf8)
119+
let requestBody = Data(UUID().uuidString.utf8)
120120
let responseStatus = Int.random(in: 201 ..< 500)
121121
let responseHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
122-
let responseBody = UUID().uuidString.data(using: .utf8)
122+
let responseBody = Data(UUID().uuidString.utf8)
123123

124124
let handler: LegacyHTTPClient.Handler = { request, _, completion in
125125
XCTAssertEqual(request.url, url, "url should match")
@@ -152,7 +152,7 @@ final class LegacyHTTPClientTests: XCTestCase {
152152
let requestHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
153153
let responseStatus = Int.random(in: 201 ..< 500)
154154
let responseHeaders = HTTPClientHeaders([HTTPClientHeaders.Item(name: UUID().uuidString, value: UUID().uuidString)])
155-
let responseBody = UUID().uuidString.data(using: .utf8)
155+
let responseBody = Data(UUID().uuidString.utf8)
156156

157157
let handler: LegacyHTTPClient.Handler = { request, _, completion in
158158
XCTAssertEqual(request.url, url, "url should match")

0 commit comments

Comments
 (0)