diff --git a/src/clippy/clippy.cpp b/src/clippy/clippy.cpp index f84acdc..c17e7d4 100644 --- a/src/clippy/clippy.cpp +++ b/src/clippy/clippy.cpp @@ -1,5 +1,7 @@ #include +#include + #include #include @@ -8,7 +10,9 @@ void Clippy::Run(const std::vector& args) { } bool Clippy::TryExecuteClippyCommand(const std::vector& args) { - if (args.size() >= 2 && (args[1] == "help" || args[1] == "hello")) { + using namespace utils::parametres; + if (CheckPatternParametres(args, Parameter::Skip, "help", + Parameter::Anything)) { std::cout << "Hello I'm clippy" << std::endl; std::cout << "Parametres: { "; for (size_t i = 0; i < args.size(); ++i) { diff --git a/src/main.cpp b/src/main.cpp index 8b36b82..0e68cf5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,20 +1,11 @@ #include +#include #include #include -std::vector ParseInputParameters(int argc, char* argv[]) { - std::vector result; - result.reserve(argc); - - for (size_t i = 0; i < argc; ++i) { - result.emplace_back(argv[i]); - } - - return result; -} - int main(int argc, char* argv[]) { + using namespace utils::parametres; auto params = ParseInputParameters(argc, argv); Clippy clippy; diff --git a/src/utils/parametres.cpp b/src/utils/parametres.cpp new file mode 100644 index 0000000..552ad1a --- /dev/null +++ b/src/utils/parametres.cpp @@ -0,0 +1,14 @@ +#include + +namespace utils::parametres { +std::vector ParseInputParameters(int argc, char* argv[]) { + std::vector result; + result.reserve(argc); + + for (size_t i = 0; i < argc; ++i) { + result.emplace_back(argv[i]); + } + + return result; +} +} // namespace utils diff --git a/src/utils/parametres.hpp b/src/utils/parametres.hpp new file mode 100644 index 0000000..edbcdd5 --- /dev/null +++ b/src/utils/parametres.hpp @@ -0,0 +1,66 @@ +#pragma once +#include +#include +#include + +namespace utils::parametres { +enum class Parameter { Skip, Nothing, Anything }; + +namespace detail { +template +bool CheckPatternParametresImpl(const std::vector& args, + Parameter t) { + if (t == Parameter::Nothing) { + return index == args.size(); + } else if (t == Parameter::Anything) { + return true; + } + return false; +} + +template , bool>> +bool CheckPatternParametresImpl(const std::vector& args, T&& head, + Args&&... pattern); + +template , bool> = true> +bool CheckPatternParametresImpl(const std::vector& args, T&& p, + Args&&... pattern) { + if (index >= args.size()) { + return false; + } + + if (p != Parameter::Skip) { + throw std::logic_error("Unsupported parameter"); + } + + return CheckPatternParametresImpl( + args, std::forward(pattern)...); +} + +template , bool> = true> +bool CheckPatternParametresImpl(const std::vector& args, T&& head, + Args&&... pattern) { + if (index >= args.size()) { + return false; + } + if (args[index] != head) { + return false; + } + return CheckPatternParametresImpl( + args, std::forward(pattern)...); +} +} // namespace detail + +std::vector ParseInputParameters(int argc, char* argv[]); + +template +bool CheckPatternParametres(const std::vector& args, + Args&&... pattern) { + return detail::CheckPatternParametresImpl<0, Args...>( + args, std::forward(pattern)...); +} + +} // namespace utils