126 mutable std::optional<std::string>
what_;
130 const std::string &
calcWhat()
const;
137 template<
typename...
Args>
139 : err { .level = lvlError, .msg =
HintFmt(args...), .status = status }
142 template<
typename...
Args>
143 explicit BaseError(
const std::string & fs,
const Args & ... args)
144 : err { .level = lvlError, .msg =
HintFmt(fs, args...) }
147 template<
typename... Args>
148 BaseError(
const Suggestions & sug,
const Args & ... args)
149 : err { .level = lvlError, .msg = HintFmt(args...), .suggestions = sug }
152 BaseError(HintFmt hint)
153 : err { .level = lvlError, .msg = hint }
156 BaseError(ErrorInfo && e)
160 BaseError(
const ErrorInfo & e)
164 const char * what() const noexcept
override {
return calcWhat().c_str(); }
165 const std::string & msg()
const {
return calcWhat(); }
166 const ErrorInfo & info()
const {
calcWhat();
return err; }
168 void withExitStatus(
unsigned int status)
173 void atPos(std::shared_ptr<Pos> pos) {
177 void pushTrace(Trace trace)
179 err.traces.push_front(trace);
182 template<
typename... Args>
183 void addTrace(std::shared_ptr<Pos> && e, std::string_view fs,
const Args & ... args)
185 addTrace(std::move(e), HintFmt(std::string(fs), args...));
188 void addTrace(std::shared_ptr<Pos> && e, HintFmt hint, TracePrint print = TracePrint::Default);
190 bool hasTrace()
const {
return !err.traces.empty(); }
192 const ErrorInfo & info() {
return err; };