/* This file is part of TON Blockchain Library. TON Blockchain Library is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. TON Blockchain Library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with TON Blockchain Library. If not, see . Copyright 2017-2019 Telegram Systems LLP */ #include "td/utils/OptionsParser.h" #if TD_HAVE_GETOPT #include "getopt.h" #endif #if !TD_WINDOWS #include #include #endif namespace td { void OptionsParser::set_description(std::string description) { description_ = std::move(description); } void OptionsParser::add_option(Option::Type type, char short_key, Slice long_key, Slice description, std::function callback) { for (auto &option : options_) { if (option.short_key == short_key || (!long_key.empty() && long_key == option.long_key)) { LOG(ERROR) << "Ignore duplicated option '" << short_key << "' '" << long_key << "'"; } } options_.push_back(Option{type, short_key, long_key.str(), description.str(), std::move(callback)}); } void OptionsParser::add_option(char short_key, Slice long_key, Slice description, std::function callback) { add_option(Option::Type::Arg, short_key, long_key, description, std::move(callback)); } void OptionsParser::add_option(char short_key, Slice long_key, Slice description, std::function callback) { // Ouch. There must be some better way add_option(Option::Type::NoArg, short_key, long_key, description, std::bind([](std::function &func, Slice) { return func(); }, std::move(callback), std::placeholders::_1)); } Result OptionsParser::run(int argc, char *argv[]) { #if TD_HAVE_GETOPT char buff[1024]; StringBuilder sb(MutableSlice{buff, sizeof(buff)}); for (auto &opt : options_) { CHECK(opt.type != Option::OptionalArg); sb << opt.short_key; if (opt.type == Option::Arg) { sb << ":"; } } if (sb.is_error()) { return Status::Error("Can't parse options"); } CSlice short_options = sb.as_cslice(); vector