Ver código fonte

More did-you-mean errors for config files

default_compile_flags
vector-of-bool 4 anos atrás
pai
commit
f351b05817
9 arquivos alterados com 69 adições e 5 exclusões
  1. +6
    -0
      docs/err/invalid-config-key.rst
  2. +2
    -1
      src/dds/deps.cpp
  3. +12
    -0
      src/dds/dym.cpp
  4. +7
    -0
      src/dds/dym.hpp
  5. +7
    -0
      src/dds/error/errors.cpp
  6. +1
    -0
      src/dds/error/errors.hpp
  7. +2
    -2
      src/dds/library/manifest.cpp
  8. +2
    -1
      src/dds/package/manifest.cpp
  9. +30
    -1
      src/dds/toolchain/from_dds.cpp

+ 6
- 0
docs/err/invalid-config-key.rst Ver arquivo

@@ -0,0 +1,6 @@
Error: Invalid configuration key
################################

``dds`` uses a very simple key-value-pair plaintext configuration file format.
Receiving this error indicates that one of the keys in a configuration file is
invalid.

+ 2
- 1
src/dds/deps.cpp Ver arquivo

@@ -1,5 +1,6 @@
#include "./deps.hpp"

#include <dds/dym.hpp>
#include <dds/error/errors.hpp>
#include <dds/repo/repo.hpp>
#include <dds/source/dist.hpp>
@@ -53,7 +54,7 @@ dependency_manifest dependency_manifest::from_file(path_ref fpath) {
}
return false;
},
lm::reject_unknown());
lm_reject_dym{{"Depends"}});
return ret;
}


+ 12
- 0
src/dds/dym.cpp Ver arquivo

@@ -1,5 +1,7 @@
#include <dds/dym.hpp>

#include <dds/error/errors.hpp>

#include <range/v3/algorithm/min_element.hpp>
#include <range/v3/view/cartesian_product.hpp>
#include <range/v3/view/iota.hpp>
@@ -43,3 +45,13 @@ std::size_t dds::lev_edit_distance(std::string_view a, std::string_view b) noexc

return matrix.back().back();
}

bool lm_reject_dym::operator()(std::string_view context,
std::string_view key,
std::string_view) const {
assert(candidates.size() > 0);
throw_user_error<errc::invalid_config_key>("{}: Unknown key '{}' (Did you meann '{}'?)",
context,
key,
*did_you_mean(key, candidates));
}

+ 7
- 0
src/dds/dym.hpp Ver arquivo

@@ -58,4 +58,11 @@ did_you_mean(std::string_view given, std::initializer_list<std::string_view> str
return did_you_mean(given, ranges::views::all(strings));
}

struct lm_reject_dym {
std::initializer_list<std::string_view> candidates;

[[noreturn]] bool
operator()(std::string_view context, std::string_view key, std::string_view value) const;
};

} // namespace dds

+ 7
- 0
src/dds/error/errors.cpp Ver arquivo

@@ -43,6 +43,8 @@ std::string error_url_suffix(dds::errc ec) noexcept {
return "invalid-version-string.html#range";
case errc::invalid_version_string:
return "invalid-version-string.html";
case errc::invalid_config_key:
return "invalid-config-key.html";
case errc::none:
break;
}
@@ -153,6 +155,8 @@ information.
specification. Refer to the documentation and https://semver.org/ for more
information.
)";
case errc::invalid_config_key:
return R"(The `key' in a `key: value' pair was not recognized.)";
case errc::none:
break;
}
@@ -198,6 +202,9 @@ std::string_view dds::default_error_string(dds::errc ec) noexcept {
case errc::invalid_version_string:
return "Attempted to parse an invalid version string. <- (Seeing this text is a `dds` bug. "
"Please report it.)";
case errc::invalid_config_key:
return "Found an invalid configuration key. <- (Seeing this text is a `dds` bug. Please "
"report it.)";
case errc::none:
break;
}

+ 1
- 0
src/dds/error/errors.hpp Ver arquivo

@@ -29,6 +29,7 @@ enum class errc {

invalid_version_range_string,
invalid_version_string,
invalid_config_key,
};

std::string error_reference_of(errc) noexcept;

+ 2
- 2
src/dds/library/manifest.cpp Ver arquivo

@@ -1,5 +1,6 @@
#include "./manifest.hpp"

#include <dds/dym.hpp>
#include <dds/util/algo.hpp>
#include <range/v3/view/transform.hpp>

@@ -20,8 +21,7 @@ library_manifest library_manifest::load_from_file(const fs::path& fpath) {
lm::read_accumulate("Uses", uses_strings),
lm::read_accumulate("Links", links_strings),
lm::read_required("Name", ret.name),
lm::ignore_x_keys(),
lm::reject_unknown());
lm_reject_dym{{"Uses", "Links", "Name"}});

extend(ret.uses, ranges::views::transform(uses_strings, lm::split_usage_string));
extend(ret.links, ranges::views::transform(links_strings, lm::split_usage_string));

+ 2
- 1
src/dds/package/manifest.cpp Ver arquivo

@@ -1,5 +1,6 @@
#include "./manifest.hpp"

#include <dds/dym.hpp>
#include <dds/util/string.hpp>
#include <libman/parse.hpp>

@@ -23,7 +24,7 @@ package_manifest package_manifest::load_from_file(const fs::path& fpath) {
lm::read_required("Version", version_str),
lm::read_accumulate("Depends", depends_strs),
lm::read_opt("Test-Driver", opt_test_driver),
lm::reject_unknown());
lm_reject_dym{{"Name", "Namespace", "Version", "Depends", "Test-Driver"}});

if (ret.pkg_id.name.empty()) {
throw std::runtime_error(

+ 30
- 1
src/dds/toolchain/from_dds.cpp Ver arquivo

@@ -1,5 +1,6 @@
#include "./from_dds.hpp"

#include <dds/dym.hpp>
#include <dds/toolchain/prep.hpp>
#include <dds/toolchain/toolchain.hpp>
#include <dds/util/algo.hpp>
@@ -146,7 +147,35 @@ toolchain dds::parse_toolchain_dds(const lm::pair_list& pairs, strv context) {
lm::read_opt("Executable-Prefix", exe_prefix),
lm::read_opt("Executable-Suffix", exe_suffix),
// Die:
lm::reject_unknown());
lm_reject_dym{{
"Compiler-ID",
"C-Compiler",
"C++-Compiler",
"C-Version",
"C++-Version",
"Include-Template",
"External-Include-Template",
"Define-Template",
"Warning-Flags",
"Flags",
"C-Flags",
"C++-Flags",
"Link-Flags",
"Optimize",
"Debug",
"Compiler-Launcher",
"Deps-Mode",
"C-Compile-File",
"C++-Compile-File",
"Create-Archive",
"Link-Executable",
"Archive-Prefix",
"Archive-Suffix",
"Object-Prefix",
"Object-Suffix",
"Executable-Prefix",
"Executable-Suffix",
}});

toolchain_prep tc;


Carregando…
Cancelar
Salvar