Skip to content

Commit 2d2a67f

Browse files
committed
refactor(decode): Use throwing methods instead of result type
1 parent a6574d5 commit 2d2a67f

File tree

1 file changed

+14
-23
lines changed

1 file changed

+14
-23
lines changed

Sources/Decode.swift

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,13 @@ public enum InvalidToken : CustomStringConvertible, Error {
4848

4949
/// Decode a JWT
5050
public func decode(_ jwt:String, algorithms:[Algorithm], verify:Bool = true, audience:String? = nil, issuer:String? = nil) throws -> Payload {
51-
switch load(jwt) {
52-
case let .success(header, payload, signature, signatureInput):
53-
if verify {
54-
try validateClaims(payload, audience: audience, issuer: issuer)
55-
try verifySignature(algorithms, header: header, signingInput: signatureInput, signature: signature)
56-
}
57-
58-
return payload
59-
case .failure(let failure):
60-
throw failure
51+
let (header, payload, signature, signatureInput) = try load(jwt)
52+
if verify {
53+
try validateClaims(payload, audience: audience, issuer: issuer)
54+
try verifySignature(algorithms, header: header, signingInput: signatureInput, signature: signature)
6155
}
56+
57+
return payload
6258
}
6359

6460
/// Decode a JWT
@@ -68,15 +64,10 @@ public func decode(_ jwt:String, algorithm:Algorithm, verify:Bool = true, audien
6864

6965
// MARK: Parsing a JWT
7066

71-
enum LoadResult {
72-
case success(header:Payload, payload:Payload, signature:Data, signatureInput:String)
73-
case failure(InvalidToken)
74-
}
75-
76-
func load(_ jwt:String) -> LoadResult {
67+
func load(_ jwt:String) throws -> (header: Payload, payload: Payload, signature: Data, signatureInput: String) {
7768
let segments = jwt.components(separatedBy: ".")
7869
if segments.count != 3 {
79-
return .failure(.decodeError("Not enough segments"))
70+
throw InvalidToken.decodeError("Not enough segments")
8071
}
8172

8273
let headerSegment = segments[0]
@@ -86,30 +77,30 @@ func load(_ jwt:String) -> LoadResult {
8677

8778
let headerData = base64decode(headerSegment)
8879
if headerData == nil {
89-
return .failure(.decodeError("Header is not correctly encoded as base64"))
80+
throw InvalidToken.decodeError("Header is not correctly encoded as base64")
9081
}
9182

9283
let header = (try? JSONSerialization.jsonObject(with: headerData!, options: JSONSerialization.ReadingOptions(rawValue: 0))) as? Payload
9384
if header == nil {
94-
return .failure(.decodeError("Invalid header"))
85+
throw InvalidToken.decodeError("Invalid header")
9586
}
9687

9788
let payloadData = base64decode(payloadSegment)
9889
if payloadData == nil {
99-
return .failure(.decodeError("Payload is not correctly encoded as base64"))
90+
throw InvalidToken.decodeError("Payload is not correctly encoded as base64")
10091
}
10192

10293
let payload = (try? JSONSerialization.jsonObject(with: payloadData!, options: JSONSerialization.ReadingOptions(rawValue: 0))) as? Payload
10394
if payload == nil {
104-
return .failure(.decodeError("Invalid payload"))
95+
throw InvalidToken.decodeError("Invalid payload")
10596
}
10697

10798
let signature = base64decode(signatureSegment)
10899
if signature == nil {
109-
return .failure(.decodeError("Signature is not correctly encoded as base64"))
100+
throw InvalidToken.decodeError("Signature is not correctly encoded as base64")
110101
}
111102

112-
return .success(header:header!, payload:payload!, signature:signature!, signatureInput:signatureInput)
103+
return (header: header!, payload: payload!, signature: signature!, signatureInput: signatureInput)
113104
}
114105

115106
// MARK: Signature Verification

0 commit comments

Comments
 (0)