/* * Copyright (C) 2021-present ScyllaDB */ /* * SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0 */ #pragma once #include #include #include "seastarx.hh" namespace db { class extensions; class config; } namespace tools::utils { class basic_option { public: const char* name; const char* description; public: basic_option(const char* name, const char* description) : name(name), description(description) { } virtual void add_option(boost::program_options::options_description& opts) const = 0; virtual app_template::positional_option to_positional_option() const = 0; }; template class typed_option : public basic_option { std::optional _default_value; int _count; virtual void add_option(boost::program_options::options_description& opts) const override { if (_default_value) { opts.add_options()(name, boost::program_options::value()->default_value(*_default_value), description); } else { opts.add_options()(name, boost::program_options::value(), description); } } virtual app_template::positional_option to_positional_option() const override { if (_default_value) { return {name, boost::program_options::value()->default_value(*_default_value), description, _count}; } else { return {name, boost::program_options::value(), description, _count}; } } public: typed_option(const char* name, const char* description) : basic_option(name, description) { } typed_option(const char* name, T default_value, const char* description) : basic_option(name, description), _default_value(std::move(default_value)) { } typed_option(const char* name, const char* description, int count) : basic_option(name, description), _count(count) { } }; template <> class typed_option : public basic_option { virtual void add_option(boost::program_options::options_description& opts) const override { opts.add_options()(name, description); } virtual app_template::positional_option to_positional_option() const override { throw std::runtime_error(fmt::format("typed_option<> (option {}) cannot be used as positional option", name)); } public: typed_option(const char* name, const char* description) : basic_option(name, description) { } }; class operation_option { shared_ptr _opt; // need copy to support convenient range declaration of std::vector