diff --git a/docs/basics/validation.de.md b/docs/basics/validation.de.md index 00f804723..bfec29baf 100644 --- a/docs/basics/validation.de.md +++ b/docs/basics/validation.de.md @@ -169,4 +169,65 @@ Die erste Überprüfung verwendet `!` als Operator, was bedingt, dass der Wert n validations.add("favoriteColor", as: String.self, is: .in("red", "blue", "green"), required: false) ``` -Die Überprüfung verwendet die Bedingung *in*, was bedingt, dass der Wert mit einer der Angaben im Beispiel (red, blue, green) übereinstimmen muss. Mit dem Parameter *required:* legen wir fest, dass die Überprüfung nicht fehlschlägt, sollte der Wert in der Anfrage fehlen. \ No newline at end of file +Die Überprüfung verwendet die Bedingung *in*, was bedingt, dass der Wert mit einer der Angaben im Beispiel (red, blue, green) übereinstimmen muss. Mit dem Parameter *required:* legen wir fest, dass die Überprüfung nicht fehlschlägt, sollte der Wert in der Anfrage fehlen. + +## Benutzerdefinierte Validatoren + +Durch die Erstellung einer eigenen Regelvorlage können wir Vapors bestehendes Regelwerk erweitern. Im folgenden Abschnitt erstellen wir eine neue Vorlage, um eine Postleitzahl zu gegenzuprüfen. + +Zunächst erstellen wir einen neuen Typ, um die Ergebnisse der Validierung darzustellen. Diese Struktur ist dafür verantwortlich, zu melden, ob eine bestimmte Zeichenfolge eine gültige Postleitzahl ist. +```swift +extension ValidatorResults { + /// Represents the result of a validator that checks if a string is a valid zip code. + public struct ZipCode { + /// Indicates whether the input is a valid zip code. + public let isValidZipCode: Bool + } +} +``` + +Als Nächstes wird der neue Typ an `ValidatorResult` angepasst, das das von einem benutzerdefinierten Validator erwartete Verhalten definiert. + +```swift +extension ValidatorResults.ZipCode: ValidatorResult { + public var isFailure: Bool { + !self.isValidZipCode + } + + public var successDescription: String? { + "is a valid zip code" + } + + public var failureDescription: String? { + "is not a valid zip code" + } +} +``` + +Abschließend wird die Validierungslogik für Postleitzahlen implementiert. Dabei wird ein regulärer Ausdruck verwendet, um zu prüfen, ob die Eingabezeichenfolge dem Format einer US-amerikanischen Postleitzahl entspricht. + +```swift +private let zipCodeRegex: String = "^\\d{5}(?:[-\\s]\\d{4})?$" + +extension Validator where T == String { + /// Validates whether a `String` is a valid zip code. + public static var zipCode: Validator { + .init { input in + guard let range = input.range(of: zipCodeRegex, options: [.regularExpression]), + range.lowerBound == input.startIndex && range.upperBound == input.endIndex + else { + return ValidatorResults.ZipCode(isValidZipCode: false) + } + return ValidatorResults.ZipCode(isValidZipCode: true) + } + } +} +``` + + +Nachdem die neue Vorlage definiert wurde, kann sie in der Anwendung verwendet werden: + +```swift +validations.add("zipCode", as: String.self, is: .zipCode) +``` +