Files
Emily Boudreaux ec13264050 feat(reflect-cpp): Switched from glaze -> reflect cpp
A bug was discovered in glaze which prevented valid toml output. We have
switched to toml++ and reflect-cpp. The interface has remained the same
so this should not break any code
2025-12-06 10:55:46 -05:00

67 lines
2.1 KiB
C++

#ifndef RFL_PARSING_SCHEMAFUL_ISSCHEMAFULREADER_HPP_
#define RFL_PARSING_SCHEMAFUL_ISSCHEMAFULREADER_HPP_
#include <concepts>
#include <optional>
#include <string>
#include <variant>
#include "../../Result.hpp"
namespace rfl::parsing::schemaful {
using MockVariantType = std::variant<std::string, int>;
template <class R>
struct MockMapReader {
void read(const std::string_view&, typename R::InputVarType&) const {}
};
template <class R>
struct MockObjectReader {
void read(const int, typename R::InputVarType&) const {}
};
template <class R>
struct MockUnionReader {
static rfl::Result<MockVariantType> read(const R&, const size_t,
typename R::InputVarType&) {
return error("This is a mock type.");
}
};
template <class R>
concept IsSchemafulReader =
requires(R r, typename R::InputVarType var, typename R::InputObjectType obj,
typename R::InputMapType m, typename R::InputUnionType u,
MockMapReader<R> map_reader, MockObjectReader<R> object_reader) {
/// A schemaful reader needs to differentiate between objects, for which
/// the field names are known at compile time and maps, for which the
/// field names are not known at compile time.
{ r.read_map(map_reader, m) } -> std::same_as<std::optional<Error>>;
/// A schemaful reader can read fields by order and does not have to
/// compare strings - the correct order of the fields is guaranteed by the
/// schema.
{
r.read_object(object_reader, obj)
} -> std::same_as<std::optional<Error>>;
/// A schemaful reader needs an explicit union type.
{
r.template read_union<MockVariantType, MockUnionReader<R>>(u)
} -> std::same_as<rfl::Result<MockVariantType>>;
/// It needs to be possible to transform variables to maps.
{ r.to_map(var) } -> std::same_as<rfl::Result<typename R::InputMapType>>;
/// It needs to be possible to transform variables to unions.
{
r.to_union(var)
} -> std::same_as<rfl::Result<typename R::InputUnionType>>;
};
} // namespace rfl::parsing::schemaful
#endif