1 // Copyright 2024 The Kyua Authors. 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are 6 // met: 7 // 8 // * Redistributions of source code must retain the above copyright 9 // notice, this list of conditions and the following disclaimer. 10 // * Redistributions in binary form must reproduce the above copyright 11 // notice, this list of conditions and the following disclaimer in the 12 // documentation and/or other materials provided with the distribution. 13 // * Neither the name of Google Inc. nor the names of its contributors 14 // may be used to endorse or promote products derived from this software 15 // without specific prior written permission. 16 // 17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29 #include "engine/prepare/prepare.hpp" 30 31 #include "engine/prepare/prepare_all.hpp" 32 33 namespace prepare = engine::prepare; 34 35 36 /// List of registered requirement preparation handlers. 37 /// 38 /// Use register_handler() to add an entry to this global list. 39 static std::vector< std::shared_ptr< prepare::handler > > _handlers = { 40 std::shared_ptr< prepare::handler >(new prepare::prepare_all()) 41 }; 42 43 44 void 45 prepare::register_handler(const std::shared_ptr< handler > handler) 46 { 47 _handlers.push_back(handler); 48 } 49 50 51 const std::vector< std::shared_ptr< prepare::handler > > 52 prepare::handlers() 53 { 54 return _handlers; 55 } 56 57 58 int 59 prepare::run(const std::vector< std::string >& handler_names, 60 cmdline::ui* ui, 61 const cmdline::parsed_cmdline& cmdline, 62 const config::tree& user_config) 63 { 64 for (auto& hname : handler_names) { 65 std::shared_ptr< prepare::handler > handler = nullptr; 66 for (auto& h : prepare::handlers()) 67 if (h->name() == hname) { 68 handler = h; 69 break; 70 } 71 72 if (handler == nullptr) { 73 ui->out(F("Unknown requirement preparation handler: %s") % hname); 74 return EXIT_FAILURE; 75 } 76 77 if (handler->exec(ui, cmdline, user_config) != 0) 78 // suppress the actual code -- main limits possible exit codes 79 return EXIT_FAILURE; 80 } 81 82 return EXIT_SUCCESS; 83 } 84