/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
#include "cmSubcommandTable.h"

#include <algorithm>

#include "cmExecutionStatus.h"
#include "cmStringAlgorithms.h"

cmSubcommandTable::cmSubcommandTable(std::initializer_list<InitElem> init)
  : Impl(init.begin(), init.end())
{
  std::sort(this->Impl.begin(), this->Impl.end(),
            [](Elem const& left, Elem const& right) {
              return left.first < right.first;
            });
}

bool cmSubcommandTable::operator()(cm::string_view key,
                                   std::vector<std::string> const& args,
                                   cmExecutionStatus& status) const
{
  auto const it = std::lower_bound(
    this->Impl.begin(), this->Impl.end(), key,
    [](Elem const& elem, cm::string_view k) { return elem.first < k; });
  if (it != this->Impl.end() && it->first == key) {
    return it->second(args, status);
  }
  status.SetError(cmStrCat("does not recognize sub-command ", key));
  return false;
}
