Skip to content

Commit 43b6632

Browse files
authored
Improve error message information across all possible errors (#777)
Signed-off-by: Juan Cruz Viotti <[email protected]>
1 parent 8671575 commit 43b6632

File tree

62 files changed

+626
-271
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+626
-271
lines changed

enterprise/index/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ target_compile_definitions(sourcemeta_one_enterprise_index PUBLIC SOURCEMETA_ONE
55

66
target_link_libraries(sourcemeta_one_enterprise_index PUBLIC sourcemeta::one::resolver)
77
target_link_libraries(sourcemeta_one_enterprise_index PUBLIC sourcemeta::blaze::configuration)
8+
target_link_libraries(sourcemeta_one_enterprise_index PRIVATE sourcemeta::core::error)
89
target_link_libraries(sourcemeta_one_enterprise_index PRIVATE sourcemeta::blaze::compiler)
910
target_link_libraries(sourcemeta_one_enterprise_index PRIVATE sourcemeta::blaze::linter)
1011
target_link_libraries(sourcemeta_one_enterprise_index PRIVATE sourcemeta::core::yaml)

enterprise/index/enterprise_index.cc

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include <sourcemeta/blaze/compiler.h>
44
#include <sourcemeta/blaze/linter.h>
55

6+
#include <sourcemeta/core/error.h>
7+
#include <sourcemeta/core/jsonschema.h>
68
#include <sourcemeta/core/yaml.h>
79

810
#include <string> // std::string
@@ -19,12 +21,28 @@ auto load_custom_lint_rules(
1921
configuration.default_dialect.value_or(std::string{})};
2022
for (const auto &rule_path : configuration.lint.rules) {
2123
auto rule_schema{sourcemeta::core::read_yaml_or_json(rule_path)};
22-
custom_names.emplace(bundle.add<sourcemeta::blaze::SchemaRule>(
23-
rule_schema, sourcemeta::core::schema_walker,
24-
[&callback, &resolver](const auto identifier) {
25-
return resolver(identifier, callback);
26-
},
27-
sourcemeta::blaze::default_schema_compiler, default_dialect));
24+
try {
25+
custom_names.emplace(bundle.add<sourcemeta::blaze::SchemaRule>(
26+
rule_schema, sourcemeta::core::schema_walker,
27+
[&callback, &resolver](const auto identifier) {
28+
return resolver(identifier, callback);
29+
},
30+
sourcemeta::blaze::default_schema_compiler, default_dialect));
31+
} catch (const sourcemeta::blaze::LinterInvalidNamePatternError &error) {
32+
throw sourcemeta::core::FileError<
33+
sourcemeta::blaze::LinterInvalidNamePatternError>(
34+
rule_path, error.identifier(), error.regex());
35+
} catch (const sourcemeta::blaze::LinterInvalidNameError &error) {
36+
throw sourcemeta::core::FileError<
37+
sourcemeta::blaze::LinterInvalidNameError>(
38+
rule_path, error.identifier(), error.what());
39+
} catch (const sourcemeta::blaze::LinterMissingNameError &) {
40+
throw sourcemeta::core::FileError<
41+
sourcemeta::blaze::LinterMissingNameError>(rule_path);
42+
} catch (const sourcemeta::core::SchemaUnknownBaseDialectError &) {
43+
throw sourcemeta::core::FileError<
44+
sourcemeta::core::SchemaUnknownBaseDialectError>(rule_path);
45+
}
2846
}
2947
}
3048

src/configuration/include/sourcemeta/one/configuration.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ struct Configuration {
1919
const std::filesystem::path &collections_path)
2020
-> sourcemeta::core::JSON;
2121
static auto parse(const sourcemeta::core::JSON &data,
22+
const std::filesystem::path &configuration_path,
2223
const std::filesystem::path &default_base_path)
2324
-> Configuration;
2425

src/configuration/include/sourcemeta/one/configuration_error.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ namespace sourcemeta::one {
1515

1616
class ConfigurationValidationError : public std::exception {
1717
public:
18-
ConfigurationValidationError(const sourcemeta::blaze::SimpleOutput &output) {
18+
ConfigurationValidationError(std::filesystem::path path,
19+
const sourcemeta::blaze::SimpleOutput &output)
20+
: path_{std::move(path)} {
1921
std::ostringstream stream;
2022
for (const auto &entry : output) {
2123
stream << entry.message << "\n";
@@ -33,11 +35,16 @@ class ConfigurationValidationError : public std::exception {
3335
return "Invalid configuration";
3436
}
3537

38+
[[nodiscard]] auto path() const noexcept -> const std::filesystem::path & {
39+
return this->path_;
40+
}
41+
3642
[[nodiscard]] auto stacktrace() const noexcept -> const auto & {
3743
return this->stacktrace_;
3844
}
3945

4046
private:
47+
std::filesystem::path path_;
4148
std::string stacktrace_;
4249
};
4350

src/configuration/parse.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ auto entries_from_json(T &result, const std::filesystem::path &location,
5252
.to_string()}
5353
.parent_path()
5454
: default_base_path};
55-
collection_input.erase("x-sourcemeta-one:path");
5655
auto collection{sourcemeta::blaze::Configuration::from_json(
5756
collection_input, base_path)};
5857
// Filesystems behave differently with regards to casing. To unify
@@ -83,6 +82,7 @@ auto entries_from_json(T &result, const std::filesystem::path &location,
8382
namespace sourcemeta::one {
8483

8584
auto Configuration::parse(const sourcemeta::core::JSON &data,
85+
const std::filesystem::path &configuration_path,
8686
const std::filesystem::path &default_base_path)
8787
-> Configuration {
8888
const auto compiled_schema{sourcemeta::blaze::from_json(
@@ -91,7 +91,7 @@ auto Configuration::parse(const sourcemeta::core::JSON &data,
9191
sourcemeta::blaze::Evaluator evaluator;
9292
sourcemeta::blaze::SimpleOutput output{data};
9393
if (!evaluator.validate(compiled_schema.value(), data, std::ref(output))) {
94-
throw ConfigurationValidationError(output);
94+
throw ConfigurationValidationError(configuration_path, output);
9595
}
9696

9797
Configuration result;

src/index/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@ target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::one::configuratio
1818
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::one::web)
1919

2020
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::one::build)
21+
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::error)
2122
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::io)
2223
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::uri)
2324
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::json)
25+
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::yaml)
2426
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::jsonschema)
2527
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::semver)
2628
target_link_libraries(sourcemeta_one_index PRIVATE sourcemeta::core::alterschema)

src/index/error.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,65 @@ class MetaschemaError : public std::exception {
3939
std::string stacktrace_;
4040
};
4141

42+
class OptionInvalidNumericValueError : public std::exception {
43+
public:
44+
OptionInvalidNumericValueError(std::string option, std::string value)
45+
: option_{std::move(option)}, value_{std::move(value)} {}
46+
47+
[[nodiscard]] auto what() const noexcept -> const char * override {
48+
return "Expected a valid numeric value for option";
49+
}
50+
51+
[[nodiscard]] auto option() const noexcept -> const std::string & {
52+
return this->option_;
53+
}
54+
55+
[[nodiscard]] auto value() const noexcept -> const std::string & {
56+
return this->value_;
57+
}
58+
59+
private:
60+
std::string option_;
61+
std::string value_;
62+
};
63+
64+
class OptionInvalidURIValueError : public std::exception {
65+
public:
66+
OptionInvalidURIValueError(std::string option, std::string value)
67+
: option_{std::move(option)}, value_{std::move(value)} {}
68+
69+
[[nodiscard]] auto what() const noexcept -> const char * override {
70+
return "Expected a valid URI value for option";
71+
}
72+
73+
[[nodiscard]] auto option() const noexcept -> const std::string & {
74+
return this->option_;
75+
}
76+
77+
[[nodiscard]] auto value() const noexcept -> const std::string & {
78+
return this->value_;
79+
}
80+
81+
private:
82+
std::string option_;
83+
std::string value_;
84+
};
85+
4286
class CustomRuleError : public std::exception {
4387
public:
88+
CustomRuleError(std::filesystem::path path) : path_{std::move(path)} {}
89+
4490
[[nodiscard]] auto what() const noexcept -> const char * override {
4591
return "Custom linter rules are only available on the enterprise "
4692
"edition";
4793
}
94+
95+
[[nodiscard]] auto path() const noexcept -> const std::filesystem::path & {
96+
return this->path_;
97+
}
98+
99+
private:
100+
std::filesystem::path path_;
48101
};
49102

50103
} // namespace sourcemeta::one

src/index/generators.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -445,8 +445,10 @@ struct GENERATE_HEALTH {
445445
configuration, resolver, callback);
446446
#else
447447
if (!configuration.lint.rules.empty()) {
448-
// TODO: Show enough information to know where the error is coming from
449-
throw CustomRuleError();
448+
const auto *config_path{
449+
configuration.extra.try_at("x-sourcemeta-one:path")};
450+
assert(config_path);
451+
throw CustomRuleError(std::filesystem::path{config_path->to_string()});
450452
}
451453
#endif
452454

0 commit comments

Comments
 (0)