Advertisement
Guest User

Untitled

a guest
Dec 6th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. import Foundation
  2.  
  3. // MARK: - EmailValidationError
  4.  
  5. enum EmailValidationError: Error {
  6. case empty
  7. case invalidFormat
  8. }
  9.  
  10. // MARK: - PasswordValidationError
  11.  
  12. enum PasswordValidationError: Error {
  13. case empty
  14. case tooShort
  15. case noUppercaseLetter
  16. case noLowercaseLetter
  17. case noNumber
  18. }
  19.  
  20. // MARK: - Validators
  21.  
  22. struct EmptyStringValidator: Validator {
  23. private let invalidError: Error
  24.  
  25. init(invalidError: Error) {
  26. self.invalidError = invalidError
  27. }
  28.  
  29. func validate(_ value: String) -> ValidationResult {
  30. if value.isEmpty {
  31. return .invalid(errors: [invalidError])
  32. } else {
  33. return .valid
  34. }
  35. }
  36. }
  37.  
  38. struct EmailFormatValidator: Validator {
  39. func validate(_ value: String) -> ValidationResult {
  40. let magicEmailRegexStolenFromTheInternet = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"
  41. let emailTest = NSPredicate(format:"SELF MATCHES %@", magicEmailRegexStolenFromTheInternet)
  42. if emailTest.evaluate(with: value) {
  43. return .valid
  44. } else {
  45. return .invalid(errors: [EmailValidationError.invalidFormat])
  46. }
  47. }
  48. }
  49.  
  50. struct PasswordLengthValidator: Validator {
  51. func validate(_ value: String) -> ValidationResult {
  52. if value.characters.count >= 8 {
  53. return .valid
  54. } else {
  55. return .invalid(errors: [PasswordValidationError.tooShort])
  56. }
  57. }
  58. }
  59.  
  60. struct UppercaseLetterValidator: Validator {
  61. func validate(_ value: String) -> ValidationResult {
  62. let uppercaseLetterRegex = ".*[A-Z]+.*"
  63. let uppercaseLetterTest = NSPredicate(format:"SELF MATCHES %@", uppercaseLetterRegex)
  64. if uppercaseLetterTest.evaluate(with: value) {
  65. return .valid
  66. } else {
  67. return .invalid(errors: [PasswordValidationError.noUppercaseLetter])
  68. }
  69. }
  70. }
  71.  
  72. // MARK: - ValidatorFactory
  73.  
  74. struct ValidatorFactory {
  75. static let sharedInstance = ValidatorFactory()
  76. private init() {}
  77.  
  78. func emailValidator() -> Validator {
  79. return CompositeValidator(validators: emptyEmailStringValidator(), EmailFormatValidator())
  80. }
  81.  
  82. func passwordValidator() -> Validator {
  83. return CompositeValidator(validators: emptyPasswordStringValidator(), passwordStrengthValidator())
  84. }
  85.  
  86. private func emptyEmailStringValidator() -> Validator {
  87. return EmptyStringValidator(invalidError: EmailValidationError.empty)
  88. }
  89.  
  90. private func emptyPasswordStringValidator() -> Validator {
  91. return EmptyStringValidator(invalidError: PasswordValidationError.empty)
  92. }
  93.  
  94. private func passwordStrengthValidator() -> Validator {
  95. return CompositeValidator(validators: PasswordLengthValidator(), UppercaseLetterValidator())
  96. }
  97. }
  98.  
  99. // MARK: - Exectute
  100.  
  101. let emailValidator = ValidatorFactory.sharedInstance.emailValidator()
  102. print(emailValidator.validate(""))
  103. print(emailValidator.validate("invalidEmail@"))
  104. print(emailValidator.validate("validEmail@validDomain.com"))
  105.  
  106. let passwordValidator = ValidatorFactory.sharedInstance.passwordValidator()
  107. print(passwordValidator.validate(""))
  108. print(passwordValidator.validate("psS$"))
  109. print(passwordValidator.validate("paSSw0rd"))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement