diff --git a/src/lib/cli.cpp b/src/lib/cli.cpp index 32047f7..a9ca296 100644 --- a/src/lib/cli.cpp +++ b/src/lib/cli.cpp @@ -13,13 +13,12 @@ // version 3 along with this program. // If not, see https://www.gnu.org/licenses/agpl-3.0.en.html -#include "cli.h++" - #include #include #include -#include "error.h++" +#include "cli.hpp" +#include "error.hpp" namespace CLI { Flag::Flag() { diff --git a/src/lib/cli.h++ b/src/lib/cli.h++ index 93f3ee9..25e79e7 100644 --- a/src/lib/cli.h++ +++ b/src/lib/cli.h++ @@ -19,7 +19,7 @@ #include #include -#include "error.h++" +#include "error.hpp" namespace CLI { diff --git a/src/lib/cli.hpp b/src/lib/cli.hpp new file mode 100644 index 0000000..25e79e7 --- /dev/null +++ b/src/lib/cli.hpp @@ -0,0 +1,94 @@ +// Copyright 2022, FOSS-VG Developers and Contributers +// +// This program is free software: you can redistribute it and/or modify it +// under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, version 3. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied +// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// version 3 along with this program. +// If not, see https://www.gnu.org/licenses/agpl-3.0.en.html + +#pragma once + +#include +#include +#include + +#include "error.hpp" + +namespace CLI { + + struct Flag { + char shortName; + std::string longName; + // used for automatic usage generation + std::string description; + + bool present; + + Flag(); + Flag(char shortName, std::string longName, std::string description); + }; + + struct Option { + char shortName; + std::string longName; + // used for automatic usage generation + std::string description; + std::string placeholder; // the "COUNT" in "ping [-c ] " + + bool present; + std::string value; + + Option(); + Option(char shortName, std::string longName, std::string placeholder, std::string description); + }; + + struct Argument { + // used for automatic usage generation + std::string description; + std::string placeholder; // the "HOST" in "ping [-c ] " + + bool present; + std::string value; + + Argument(); + Argument(std::string placeholder, std::string description); + }; + + class ArgumentsParser { + private: + std::map flagsByShortName; + std::map flagsByLongName; + std::map optionsByShortName; + std::map optionsByLongName; + std::vector arguments; + std::string description; + std::string additionalInfo; + + public: + std::string programName; + bool wrongUsage; + std::vector wrongUsageMessages; + + // using int here bc that's how main() is defined + ArgumentsParser(int argc, const char* const argv[], std::vector flags, std::vector