Line data Source code
1 : // Copyright (c) 2006-2024 Made to Order Software Corp. All Rights Reserved 2 : // 3 : // https://snapwebsites.org/project/advgetopt 4 : // contact@m2osw.com 5 : // 6 : // This program is free software; you can redistribute it and/or modify 7 : // it under the terms of the GNU General Public License as published by 8 : // the Free Software Foundation; either version 2 of the License, or 9 : // (at your option) any later version. 10 : // 11 : // This program is distributed in the hope that it will be useful, 12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 : // GNU General Public License for more details. 15 : // 16 : // You should have received a copy of the GNU General Public License along 17 : // with this program; if not, write to the Free Software Foundation, Inc., 18 : // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 : 20 : /** \file 21 : * \brief Implementation of the list validator. 22 : * 23 : * The list validator allows the library to run multiple validators against 24 : * parameters to easily allow for multiple possible values. 25 : * 26 : * This is especially useful if a parameter supports a value such as an 27 : * integer and a few keywords (i.e. "off", "disabled", "maximum", etc.) 28 : */ 29 : 30 : // self 31 : // 32 : #include "advgetopt/validator_list.h" 33 : 34 : 35 : // cppthread 36 : // 37 : #include <cppthread/log.h> 38 : 39 : 40 : // last include 41 : // 42 : #include <snapdev/poison.h> 43 : 44 : 45 : 46 : 47 : namespace advgetopt 48 : { 49 : 50 : 51 : 52 : namespace 53 : { 54 : 55 : 56 : 57 : class validator_list_factory 58 : : public validator_factory 59 : { 60 : public: 61 2 : validator_list_factory() 62 2 : { 63 2 : validator::register_validator(*this); 64 2 : } 65 : 66 4 : virtual std::string get_name() const override 67 : { 68 4 : return std::string("list"); 69 : } 70 : 71 2 : virtual std::shared_ptr<validator> create(string_list_t const & data) const override 72 : { 73 2 : return std::make_shared<validator_list>(data); 74 : } 75 : }; 76 : 77 : validator_list_factory g_validator_list_factory; 78 : 79 : 80 : 81 : } // no name namespace 82 : 83 : 84 : 85 : 86 : 87 2 : validator_list::validator_list(string_list_t const & param_list) 88 : { 89 2 : if(!param_list.empty()) 90 : { 91 2 : cppthread::log << cppthread::log_level_t::error 92 1 : << "validator_list() does not support any parameter." 93 2 : << cppthread::end; 94 1 : return; 95 : } 96 0 : } 97 : 98 : 99 2 : void validator_list::add_validator(validator::pointer_t v) 100 : { 101 2 : if(v != nullptr) 102 : { 103 2 : f_validators.push_back(v); 104 : } 105 2 : } 106 : 107 : 108 : /** \brief Return the name of this validator. 109 : * 110 : * This function returns "list". 111 : * 112 : * \return "list". 113 : */ 114 1 : std::string validator_list::name() const 115 : { 116 1 : return std::string("list"); 117 : } 118 : 119 : 120 : /** \brief Check the value against all the validators for one valid one. 121 : * 122 : * This function goes through the validators registered with it and if 123 : * at least one of these validators returns true, then the function 124 : * considers that input value as valid and it returns true. 125 : * 126 : * \param[in] value The value to be validated. 127 : * 128 : * \return true on a match. 129 : */ 130 124 : bool validator_list::validate(std::string const & value) const 131 : { 132 266 : for(auto const & v : f_validators) 133 : { 134 245 : if(v->validate(value)) 135 : { 136 103 : return true; 137 : } 138 : } 139 : 140 21 : return false; 141 : } 142 : 143 : 144 : 145 : } // namespace advgetopt 146 : // vim: ts=4 sw=4 et