Skip to content

Commit 1664b16

Browse files
committed
Error localization
1 parent 8e7fd10 commit 1664b16

File tree

7 files changed

+39
-18
lines changed

7 files changed

+39
-18
lines changed

GoodSwiftUI-Sample/GoodSwiftUI-Sample.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

GoodSwiftUI-Sample/GoodSwiftUI-Sample/Screens/InputFieldSampleView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ struct InputFieldSampleView: View {
1616
case notFilip
1717
case pinTooShort
1818

19-
var localizedDescription: String {
19+
var errorDescription: String? {
2020
switch self {
2121
case .notFilip:
2222
"Your name is not Filip"

Package.resolved

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ let package = Package(
2323
)
2424
],
2525
dependencies: [
26-
.package(url: "https://github.com/goodrequest/goodextensions-ios", .upToNextMajor(from: "2.0.0"))
26+
.package(url: "https://github.com/GoodRequest/GoodExtensions-iOS.git", .upToNextMajor(from: "2.0.2"))
2727
],
2828
targets: [
2929
.target(

Sources/GRInputField/Common/ValidationError.swift

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,7 @@ import GoodExtensions
1010

1111
// MARK: - Validation errors
1212

13-
@MainActor public protocol ValidationError: Error {
14-
15-
var localizedDescription: String { get }
16-
17-
}
13+
public protocol ValidationError: LocalizedError {}
1814

1915
public enum InternalValidationError: ValidationError {
2016

@@ -23,7 +19,7 @@ public enum InternalValidationError: ValidationError {
2319
case mismatch
2420
case external(MainSupplier<String>)
2521

26-
public var localizedDescription: String {
22+
public var errorDescription: String? {
2723
switch self {
2824
case .alwaysError:
2925
"Error"
@@ -35,7 +31,9 @@ public enum InternalValidationError: ValidationError {
3531
"Elements do not match"
3632

3733
case .external(let description):
38-
description()
34+
MainActor.assumeIsolated {
35+
description()
36+
}
3937
}
4038
}
4139

@@ -74,7 +72,7 @@ public extension Criterion {
7472
.failWith(error: criterion.error)
7573
}
7674

77-
static func external(error: @MainActor @escaping () -> (any Error)?) -> Criterion {
75+
static func external(error: @MainActor @escaping () -> (any LocalizedError)?) -> Criterion {
7876
Criterion { _ in error().isNil }
7977
.failWith(error: InternalValidationError.external { error()?.localizedDescription ?? " " })
8078
}

Sources/GRInputField/SwiftUI/InputField.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,10 @@ public struct InputField<LeftView: View, RightView: View>: UIViewRepresentable {
318318
return syncValidationState(uiViewState: .pending(error: validationError), context: context)
319319
}
320320

321+
guard newValidationState != previousValidationState else {
322+
return
323+
}
324+
321325
changeValidationState(to: newValidationState, uiView: uiView, context: context)
322326
}
323327

Sources/GRInputField/SwiftUI/ValidityGroup.swift

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public typealias ValidityGroup = [UUID: ValidationState]
2525

2626
// MARK: - Validation State
2727

28-
@MainActor public enum ValidationState: Sendable {
28+
@MainActor public enum ValidationState: Sendable, Equatable {
2929

3030
case valid
3131
case error(any ValidationError)
@@ -56,4 +56,23 @@ public typealias ValidityGroup = [UUID: ValidationState]
5656
}
5757
}
5858

59+
nonisolated public static func == (lhs: ValidationState, rhs: ValidationState) -> Bool {
60+
switch (lhs, rhs) {
61+
case (.valid, .valid):
62+
return true
63+
64+
case (.invalid, .invalid):
65+
return true
66+
67+
case (.error(let lhsValidationError), .error(let rhsValidationError)):
68+
return lhsValidationError.localizedDescription == rhsValidationError.localizedDescription
69+
70+
case (.pending(let lhsValidationError), .pending(let rhsValidationError)):
71+
return lhsValidationError?.localizedDescription == rhsValidationError?.localizedDescription
72+
73+
default:
74+
return false
75+
}
76+
}
77+
5978
}

0 commit comments

Comments
 (0)