diff --git a/homework/password-check/validation.cpp b/homework/password-check/validation.cpp index a2f12ff3..9f1abb24 100644 --- a/homework/password-check/validation.cpp +++ b/homework/password-check/validation.cpp @@ -1,2 +1,56 @@ #include "validation.hpp" -// TODO: Put implementations here \ No newline at end of file +#include +#include + +std::string_view getErrorMessage(const ErrorCode code) { + switch (code) { + case ErrorCode::Ok: + return "Ok"; + + case ErrorCode::PasswordNeedsAtLeastNineCharacters: + return "Password needs to have at least nine characters"; + + case ErrorCode::PasswordNeedsAtLeastOneNumber: + return "Password needs to have at least one number"; + + case ErrorCode::PasswordNeedsAtLeastOneSpecialCharacter: + return "Password needs to have at least one special character"; + + case ErrorCode::PasswordNeedsAtLeastOneUppercaseLetter: + return "Password needs to have at least one uppercase letter"; + + case ErrorCode::PasswordsDoNotMatch: + return "Passwords do not match"; + + default: + return "Unknown Message"; + } +} + +bool doPasswordsMatch(const std::string_view& input_pass, const std::string_view& reference_pass) { + return input_pass == reference_pass; +} + +ErrorCode checkPasswordRules(const std::string_view& password) { + if (password.size() < 9) { + return ErrorCode::PasswordNeedsAtLeastNineCharacters; + } + if (std::none_of(password.begin(), password.end(), [](const unsigned char c) { return std::isdigit(c); })) { + return ErrorCode::PasswordNeedsAtLeastOneNumber; + } + if (std::none_of(password.begin(), password.end(), [](const unsigned char c) { return std::isupper(c); })) { + return ErrorCode::PasswordNeedsAtLeastOneUppercaseLetter; + } + if (std::none_of(password.begin(), password.end(), [](const unsigned char c) { return std::ispunct(c); })) { + return ErrorCode::PasswordNeedsAtLeastOneSpecialCharacter; + } + + return ErrorCode::Ok; +} + +ErrorCode checkPassword(const std::string_view& password, const std::string_view& repeatedPassword) { + if (!doPasswordsMatch(password, repeatedPassword)) { + return ErrorCode::PasswordsDoNotMatch; + } + return checkPasswordRules(password); +} diff --git a/homework/password-check/validation.hpp b/homework/password-check/validation.hpp index 85160868..95ae054d 100644 --- a/homework/password-check/validation.hpp +++ b/homework/password-check/validation.hpp @@ -1,2 +1,19 @@ -// TODO: I'm empty :) Put enum and function headers here. -// Don't forget the header guard - #pragma once \ No newline at end of file +#pragma once +#include +#include + +enum class ErrorCode : uint8_t { + Ok, + PasswordNeedsAtLeastNineCharacters, + PasswordNeedsAtLeastOneNumber, + PasswordNeedsAtLeastOneSpecialCharacter, + PasswordNeedsAtLeastOneUppercaseLetter, + PasswordsDoNotMatch +}; + +[[nodiscard]] std::string_view getErrorMessage(const ErrorCode code); +[[nodiscard]] bool doPasswordsMatch(const std::string_view& input_pass, const std::string_view& reference_pass); + +[[nodiscard]] ErrorCode checkPasswordRules(const std::string_view& password); + +[[nodiscard]] ErrorCode checkPassword(const std::string_view& password, const std::string_view& repeatedPassword); \ No newline at end of file