#ifndef RFL_PARSING_PARSER_RFL_VARIANT_HPP_ #define RFL_PARSING_PARSER_RFL_VARIANT_HPP_ #include #include #include #include "../Result.hpp" #include "../Variant.hpp" #include "../always_false.hpp" #include "FieldVariantParser.hpp" #include "Parser_base.hpp" #include "schema/Type.hpp" namespace rfl { namespace parsing { template requires AreReaderAndWriter> struct Parser, ProcessorsType> { using InputVarType = typename R::InputVarType; using OutputVarType = typename W::OutputVarType; /// Expresses the variables as type T. static Result> read(const R& _r, const InputVarType& _var) noexcept { const auto to_rfl_variant = [](auto&& _var) { return rfl::Variant( std::forward>(_var) ); }; return Parser, ProcessorsType>::read( _r, _var ) .transform(to_rfl_variant); } template static void write( const W& _w, const rfl::Variant& _variant, const P& _parent ) noexcept { Parser, ProcessorsType>::write( _w, _variant.variant(), _parent ); } static schema::Type to_schema( std::map* _definitions ) { return Parser, ProcessorsType>:: to_schema(_definitions); } }; } // namespace parsing } // namespace rfl #endif