// 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.h++" 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 UnpositionalArgument { 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; UnpositionalArgument(); UnpositionalArgument(char shortName, std::string longName, std::string placeholder, std::string description); }; struct PositionalArgument { // used for automatic usage generation std::string description; std::string placeholder; // the "HOST" in "ping [-c ] " bool present; std::string value; PositionalArgument(); PositionalArgument(std::string placeholder, std::string description); }; class ArgumentsParser { private: std::map flagsByShortName; std::map flagsByLongName; std::map argumentsByShortName; std::map argumentsByLongName; std::vector positionalArguments; 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 unpositionalArguments, std::vector positionalArguments); ~ArgumentsParser(); ErrorOr getFlag(char shortName); ErrorOr getFlag(std::string longName); ErrorOr getPositionalArgument(std::vector::size_type position); ErrorOr getUnpositionalArgument(char shortName); ErrorOr getUnpositionalArgument(std::string longName); std::string getUsage(); }; }