Example #1
0
void pragma_which::run(const data::command::iterator& name_begin_,
                       const data::command::iterator& name_end_,
                       const data::command::iterator& args_begin_,
                       const data::command::iterator& args_end_,
                       iface::displayer& displayer_) const
{
  using boost::filesystem::path;
  using boost::adaptors::transformed;
  using boost::adaptors::filtered;

  const parsed_arguments args =
      parse_arguments(data::tokens_to_string(name_begin_, name_end_).value(),
                      args_begin_, args_end_);
  const auto include_path =
      _shell.engine().header_discoverer().include_path(args.header.type);
  const auto files =
      include_path |
      transformed(std::function<path(const path&)>(
          [&args](const path& path_) { return path_ / args.header.path; })) |
      filtered([](const path& path_) { return exists(path_); });

  if (files.empty())
  {
    throw exception("Include file " +
                    data::tokens_to_string(args_begin_, args_end_).value() +
                    " not found.");
  }
  else if (args.all)
  {
    displayer_.show_filename_list(
        std::vector<path>(files.begin(), files.end()));
  }
  else
  {
    displayer_.show_filename_list({files.front()});
  }
}