#ifndef RFL_PARSING_CUSTOMPARSER_HPP_ #define RFL_PARSING_CUSTOMPARSER_HPP_ #include #include #include "../internal/has_to_class_method_v.hpp" #include "../internal/to_ptr_field_tuple.hpp" #include "Parser.hpp" #include "schema/Type.hpp" namespace rfl { namespace parsing { template struct CustomParser { static Result read(const R& _r, const auto& _var) noexcept { const auto to_class = [](auto&& _h) -> Result { try { if constexpr (internal::has_to_class_method_v) { return _h.to_class(); } else { auto ptr_field_tuple = internal::to_ptr_field_tuple(_h); const auto class_from_ptrs = [](auto&... _ptrs) { return OriginalClass(std::move(*_ptrs.value_)...); }; return std::apply(class_from_ptrs, ptr_field_tuple); } } catch (std::exception& e) { return Error(e.what()); } }; return Parser::read(_r, _var).and_then(to_class); } template static auto write(const W& _w, const OriginalClass& _p, const P& _parent) noexcept { Parser::write( _w, HelperStruct::from_class(_p), _parent ); } static schema::Type to_schema(std::map* _definitions) { return Parser, ProcessorsType>::to_schema( _definitions ); } }; } // namespace parsing } // namespace rfl #endif