LeviLamina
Loading...
Searching...
No Matches
SerializationError.h
1#pragma once
2
3#include <stdexcept>
4
5#include "fmt/format.h"
6#include "ll/api/Expected.h"
7
8namespace ll::reflection {
10 std::string mField;
11 std::string mMsg;
12
13public:
14 SerializationError(std::string field, Error&& err) noexcept {
15 if (err.isA<SerializationError>()) {
16 auto& serr = err.as<SerializationError>();
17 mField = std::move(field);
18 mField += std::move(serr.mField);
19 mMsg = std::move(serr.mMsg);
20 } else {
21 if (field.ends_with('.')) {
22 field.pop_back();
23 }
24 mField = std::move(field);
25 mMsg = err.message();
26 }
27 }
28 std::string message() const noexcept override {
29 return fmt::format("Reflection error in field '{}':\n{}", mField, mMsg);
30 }
31};
32inline Unexpected makeSerMemberError(std::string_view name, Error& err) noexcept {
33 return makeError<SerializationError>(fmt::format("{}.", name), std::move(err));
34}
35inline Unexpected makeSerIndexError(std::size_t idx, Error& err) noexcept {
36 return makeError<SerializationError>(fmt::format("[{}]", idx), std::move(err));
37}
38inline Unexpected makeSerKeyError(std::string_view key, Error& err) noexcept {
39 return makeError<SerializationError>(fmt::format("[\"{}\"]", key), std::move(err));
40}
41} // namespace ll::reflection
Definition Expected.h:22
Definition Expected.h:33
Definition SerializationError.h:9