mirror of
https://github.com/fmtlib/fmt.git
synced 2025-07-30 10:47:35 +02:00
Improve error handling
This commit is contained in:
@ -2243,10 +2243,11 @@ class specs_checker : public Handler {
|
|||||||
internal::type arg_type_;
|
internal::type arg_type_;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <template <typename> class Handler, typename T, typename Context>
|
template <template <typename> class Handler, typename T,
|
||||||
constexpr void set_dynamic_spec(T &value, basic_arg<Context> arg) {
|
typename Context, typename ErrorHandler>
|
||||||
error_handler eh;
|
constexpr void set_dynamic_spec(
|
||||||
unsigned long long big_value = visit(Handler<error_handler>(eh), arg);
|
T &value, basic_arg<Context> arg, ErrorHandler eh) {
|
||||||
|
unsigned long long big_value = visit(Handler<ErrorHandler>(eh), arg);
|
||||||
if (big_value > (std::numeric_limits<int>::max)())
|
if (big_value > (std::numeric_limits<int>::max)())
|
||||||
eh.on_error("number is too big");
|
eh.on_error("number is too big");
|
||||||
value = static_cast<int>(big_value);
|
value = static_cast<int>(big_value);
|
||||||
@ -2265,13 +2266,14 @@ class specs_handler: public specs_setter<typename Context::char_type> {
|
|||||||
|
|
||||||
template <typename Id>
|
template <typename Id>
|
||||||
constexpr void on_dynamic_width(Id arg_id) {
|
constexpr void on_dynamic_width(Id arg_id) {
|
||||||
set_dynamic_spec<width_checker>(this->specs_.width_, get_arg(arg_id));
|
set_dynamic_spec<width_checker>(
|
||||||
|
this->specs_.width_, get_arg(arg_id), context_.error_handler());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Id>
|
template <typename Id>
|
||||||
constexpr void on_dynamic_precision(Id arg_id) {
|
constexpr void on_dynamic_precision(Id arg_id) {
|
||||||
set_dynamic_spec<precision_checker>(
|
set_dynamic_spec<precision_checker>(
|
||||||
this->specs_.precision_, get_arg(arg_id));
|
this->specs_.precision_, get_arg(arg_id), context_.error_handler());
|
||||||
}
|
}
|
||||||
|
|
||||||
void on_error(const char *message) {
|
void on_error(const char *message) {
|
||||||
@ -2674,10 +2676,12 @@ void handle_dynamic_spec(
|
|||||||
case arg_ref<Char>::NONE:
|
case arg_ref<Char>::NONE:
|
||||||
break;
|
break;
|
||||||
case arg_ref<Char>::INDEX:
|
case arg_ref<Char>::INDEX:
|
||||||
internal::set_dynamic_spec<Handler>(value, ctx.get_arg(ref.index));
|
internal::set_dynamic_spec<Handler>(
|
||||||
|
value, ctx.get_arg(ref.index), ctx.error_handler());
|
||||||
break;
|
break;
|
||||||
case arg_ref<Char>::NAME:
|
case arg_ref<Char>::NAME:
|
||||||
internal::set_dynamic_spec<Handler>(value, ctx.get_arg(ref.name));
|
internal::set_dynamic_spec<Handler>(
|
||||||
|
value, ctx.get_arg(ref.name), ctx.error_handler());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user