#pragma once #include #include #include #include namespace jvalidate::detail { template struct ParserContext { using Object = decltype(std::declval().as_object()); Schema & root; A schema; schema::Version version; ConstraintFactory const & factory; DocumentCache & external; ReferenceManager & ref; std::optional parent = std::nullopt; Reference where = {}; ParserContext rebind(A const & new_schema, Reference const & new_loc, std::optional parent = std::nullopt) const { return {root, new_schema, version, factory, external, ref, parent, new_loc}; } ParserContext child(A const & child, std::string const & key) const { return rebind(child, where / key, schema.as_object()); } ParserContext child(A const & child, size_t index) const { return rebind(child, where / index); } ParserContext neighbor(std::string const & key) const { return rebind((*parent)[key], where.parent() / key, parent); } schema::Node const * node() const; schema::Node const * always() const; schema::Node const * fixed_schema(bool accept) const; }; }