diff --git a/homework/password-check/validation.cpp b/homework/password-check/validation.cpp index a2f12ff3..2fac7086 100644 --- a/homework/password-check/validation.cpp +++ b/homework/password-check/validation.cpp @@ -1,2 +1,35 @@ #include "validation.hpp" -// TODO: Put implementations here \ No newline at end of file +#include +#include + +auto getErrorMessage(const ErrorCode error) -> std::string_view { + return error_messages.at(error); +} + +auto doPasswordsMatch(std::string_view lhs, std::string_view rhs) -> bool { + return lhs == rhs; +} + +auto checkPasswordRules(std::string_view password) -> ErrorCode { + if (password.size() < MIN_PASSWORD_LEN) { + return ErrorCode::PasswordNeedsAtLeastNineCharacters; + } + if (std::none_of(password.begin(), password.end(), [](unsigned char c) { return std::isdigit(c); })) { + return ErrorCode::PasswordNeedsAtLeastOneNumber; + } + if (std::none_of(password.begin(), password.end(), [](unsigned char c) { return std::ispunct(c); })) { + return ErrorCode::PasswordNeedsAtLeastOneSpecialCharacter; + } + if (std::none_of(password.begin(), password.end(), [](unsigned char c) { return std::isupper(c); })) { + return ErrorCode::PasswordNeedsAtLeastOneUppercaseLetter; + } + return ErrorCode::Ok; +} + +auto checkPassword(std::string_view lhs, std::string_view rhs) -> ErrorCode { + if (doPasswordsMatch(lhs, rhs)) { + return checkPasswordRules(lhs); + } else { + return ErrorCode::PasswordsDoNotMatch; + } +} diff --git a/homework/password-check/validation.hpp b/homework/password-check/validation.hpp index 85160868..a3402b8f 100644 --- a/homework/password-check/validation.hpp +++ b/homework/password-check/validation.hpp @@ -1,2 +1,30 @@ -// 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 { + Ok, + PasswordNeedsAtLeastNineCharacters, + PasswordNeedsAtLeastOneNumber, + PasswordNeedsAtLeastOneSpecialCharacter, + PasswordNeedsAtLeastOneUppercaseLetter, + PasswordsDoNotMatch +}; + +inline constexpr size_t MIN_PASSWORD_LEN = 9; + +inline const std::map error_messages{ + {ErrorCode::Ok, "Ok"}, + {ErrorCode::PasswordNeedsAtLeastNineCharacters, "Password needs to have at least nine characters"}, + {ErrorCode::PasswordNeedsAtLeastOneNumber, "Password needs to have at least one number"}, + {ErrorCode::PasswordNeedsAtLeastOneSpecialCharacter, "Password needs to have at least one special character"}, + {ErrorCode::PasswordNeedsAtLeastOneUppercaseLetter, "Password needs to have at least one uppercase letter"}, + {ErrorCode::PasswordsDoNotMatch, "Passwords do not match"}}; + +auto getErrorMessage(const ErrorCode error) -> std::string_view; + +auto doPasswordsMatch(std::string_view lhs, std::string_view rhs) -> bool; + +auto checkPasswordRules(std::string_view password) -> ErrorCode; + +auto checkPassword(std::string_view lhs, std::string_view rhs) -> ErrorCode;