107class BaseError :
public std::exception
115 mutable std::optional<std::string>
what_;
119 const std::string &
calcWhat()
const;
122 BaseError(
const BaseError &) =
default;
123 BaseError& operator=(
const BaseError &) =
default;
124 BaseError& operator=(BaseError &&) =
default;
126 template<
typename...
Args>
131 template<
typename...
Args>
136 template<
typename... Args>
137 BaseError(
const Suggestions & sug,
const Args & ...
args)
138 :
err { .level = lvlError, .msg = HintFmt(
args...), .suggestions = sug }
141 BaseError(HintFmt hint)
142 : err { .level = lvlError, .msg = hint }
145 BaseError(ErrorInfo && e)
149 BaseError(
const ErrorInfo & e)
155 return err.msg.str();
158 const char * what() const noexcept
override {
return calcWhat().c_str(); }
159 const std::string & msg()
const {
return calcWhat(); }
160 const ErrorInfo & info()
const {
calcWhat();
return err; }
162 void withExitStatus(
unsigned int status)
167 void atPos(std::shared_ptr<Pos> pos) {
171 void pushTrace(Trace trace)
173 err.traces.push_front(trace);
176 template<
typename... Args>
177 void addTrace(std::shared_ptr<Pos> && e, std::string_view fs,
const Args & ...
args)
179 addTrace(std::move(e), HintFmt(std::string(fs),
args...));
182 void addTrace(std::shared_ptr<Pos> && e, HintFmt hint, TracePrint print = TracePrint::Default);
184 bool hasTrace()
const {
return !err.traces.empty(); }
186 const ErrorInfo & info() {
return err; };