Digital PCT265 defect MVAPCT-271 - Ensure the app doesn't crash on invalid color hex.

This commit is contained in:
Scott Pfeil 2024-09-20 12:45:11 -04:00
parent 806ac9821a
commit 740c3eeb31

View File

@ -44,6 +44,7 @@ public final class Color: Codable {
enum ColorError: Error { enum ColorError: Error {
case badName(reason: String) case badName(reason: String)
case invalidHex(reason: String)
} }
//-------------------------------------------------- //--------------------------------------------------
@ -53,21 +54,21 @@ public final class Color: Codable {
public init(uiColor: UIColor) { public init(uiColor: UIColor) {
self.uiColor = uiColor self.uiColor = uiColor
hex = UIColor.hexString(for: uiColor) ?? "" hex = UIColor.hexString(for: uiColor) ?? ""
determineRGBA() try? determineRGBA()
} }
public init?(uiColor: UIColor?) { public init?(uiColor: UIColor?) {
guard let uiColor = uiColor else { return nil } guard let uiColor = uiColor else { return nil }
self.uiColor = uiColor self.uiColor = uiColor
hex = UIColor.hexString(for: uiColor) ?? "" hex = UIColor.hexString(for: uiColor) ?? ""
determineRGBA() try? determineRGBA()
} }
init?(name: String) { init?(name: String) {
guard let colorTuple = UIColor.names[name] else { return nil } guard let colorTuple = UIColor.names[name] else { return nil }
self.uiColor = colorTuple.uiColor self.uiColor = colorTuple.uiColor
self.hex = colorTuple.hex self.hex = colorTuple.hex
determineRGBA() try? determineRGBA()
} }
public init?(colorString: String) throws { public init?(colorString: String) throws {
@ -75,7 +76,7 @@ public final class Color: Codable {
self.uiColor = components.color self.uiColor = components.color
hex = components.hex hex = components.hex
name = components.name ?? "" name = components.name ?? ""
determineRGBA() try determineRGBA()
} }
//-------------------------------------------------- //--------------------------------------------------
@ -99,7 +100,7 @@ public final class Color: Codable {
name = components.name ?? "" name = components.name ?? ""
} }
determineRGBA() try determineRGBA()
} }
public func encode(to encoder: Encoder) throws { public func encode(to encoder: Encoder) throws {
@ -135,9 +136,12 @@ public final class Color: Codable {
return CGFloat(Int(hex[start..<end], radix: 16) ?? 0) return CGFloat(Int(hex[start..<end], radix: 16) ?? 0)
} }
private func determineRGBA() { private func determineRGBA() throws {
guard !hex.isEmpty else { return } guard !hex.isEmpty else { return }
guard hex.count > 6 else {
throw ColorError.invalidHex(reason: "Invalid hex: \(hex)")
}
let redStart = hex.startIndex let redStart = hex.startIndex
let redEnd = hex.index(redStart, offsetBy: 2) let redEnd = hex.index(redStart, offsetBy: 2)