Skip to content

Commit b48b472

Browse files
committed
Convert RESPTranslator.ParsingError from enum to struct
Motivation: Much like the change for `RedisClientError` (6471a2) any error enum that we may want to change will necessitate a major SemVer. To avoid this, we need to use the established struct-as-enum pattern. Modifications: - Change: `RESPTranslator.ParsingError` to be a struct backed by an enum Result: The library should be able to evolve to add more `RESPTranslator.ParsingError` cases without becoming a breaking change.
1 parent e7b451c commit b48b472

File tree

1 file changed

+26
-17
lines changed

1 file changed

+26
-17
lines changed

Sources/RediStack/RESP/RESPTranslator.swift

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -95,28 +95,37 @@ extension UInt8 {
9595
}
9696

9797
extension RESPTranslator {
98-
/// Representation of a `Swift.Error` found during RESP parsing.
98+
/// Possible errors thrown while parsing RESP messages.
9999
/// - Important: Any of these errors should be considered a **BUG**.
100100
///
101-
/// If you believe this is a bug from the `RESPTranslator`, file a bug at
102-
/// [https://www.gitlab.com/mordil/swift-redis-nio-client/issues](https://www.gitlab.com/mordil/swift-redis-nio-client/issues)
103-
public enum ParsingError: LocalizedError {
104-
case invalidToken
105-
case invalidBulkStringSize
106-
case bulkStringSizeMismatch
107-
case invalidIntegerFormat
108-
109-
/// See `LocalizedError.errorDescription`
101+
/// Please file a bug at [https://www.gitlab.com/mordil/RediStack/-/issues](https://www.gitlab.com/mordil/RediStack/-/issues).
102+
public struct ParsingError: LocalizedError, Equatable {
103+
/// An invalid RESP data type identifier was found.
104+
public static let invalidToken = ParsingError(.invalidToken)
105+
/// A bulk string size did not match the RESP schema.
106+
public static let invalidBulkStringSize = ParsingError(.invalidBulkStringSize)
107+
/// A bulk string's declared size did not match its content size.
108+
public static let bulkStringSizeMismatch = ParsingError(.bulkStringSizeMismatch)
109+
/// A RESP integer did not follow the RESP schema.
110+
public static let invalidIntegerFormat = ParsingError(.invalidIntegerFormat)
111+
110112
public var errorDescription: String? {
111-
switch self {
112-
case .invalidToken: return "Cannot parse RESP: Invalid Token"
113-
case .invalidBulkStringSize: return "Cannot parse RESP Bulk String: Received invalid size."
114-
case .bulkStringSizeMismatch: return "Cannot parse RESP Bulk String: Declared Size and Content Size do not match."
115-
case .invalidIntegerFormat: return "Cannot parse RESP integer: invalid integer format"
116-
}
113+
return self.base.rawValue
114+
}
115+
116+
private let base: Base
117+
private init(_ base: Base) { self.base = base }
118+
119+
private enum Base: String, Equatable {
120+
case invalidToken = "Cannot parse RESP: invalid token"
121+
case invalidBulkStringSize = "Cannot parse RESP Bulk String: received invalid size"
122+
case bulkStringSizeMismatch = "Cannot parse RESP Bulk String: declared size and content size do not match"
123+
case invalidIntegerFormat = "Cannot parse RESP Integer: invalid integer format"
117124
}
118125
}
119-
126+
}
127+
128+
extension RESPTranslator {
120129
/// Attempts to parse a `RESPValue` from the `ByteBuffer`.
121130
/// - Important: The provided `buffer` will have its reader index moved on a successful parse.
122131
/// - Throws:

0 commit comments

Comments
 (0)