/* * Copyright (C) 2021-present ScyllaDB */ /* * SPDX-License-Identifier: AGPL-3.0-or-later */ #include #include #include "seastarx.hh" 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; }; 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); } } 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); } 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