65 lines
1.8 KiB
C++
65 lines
1.8 KiB
C++
|
/* Copyright (c) 2018-2023 Marcelo Zimbres Silva (mzimbres@gmail.com)
|
||
|
*
|
||
|
* Distributed under the Boost Software License, Version 1.0. (See
|
||
|
* accompanying file LICENSE.txt)
|
||
|
*/
|
||
|
|
||
|
#ifndef BOOST_REDIS_RESP3_NODE_HPP
|
||
|
#define BOOST_REDIS_RESP3_NODE_HPP
|
||
|
|
||
|
#include <boost/redis/resp3/type.hpp>
|
||
|
|
||
|
namespace boost::redis::resp3 {
|
||
|
|
||
|
/** \brief A node in the response tree.
|
||
|
* \ingroup high-level-api
|
||
|
*
|
||
|
* RESP3 can contain recursive data structures: A map of sets of
|
||
|
* vector of etc. As it is parsed each element is passed to user
|
||
|
* callbacks (push parser). The signature of this
|
||
|
* callback is `f(resp3::node<std::string_view)`. This class is called a node
|
||
|
* because it can be seen as the element of the response tree. It
|
||
|
* is a template so that users can use it with owing strings e.g.
|
||
|
* `std::string` or `boost::static_string` etc.
|
||
|
*
|
||
|
* @tparam String A `std::string`-like type.
|
||
|
*/
|
||
|
template <class String>
|
||
|
struct basic_node {
|
||
|
/// The RESP3 type of the data in this node.
|
||
|
type data_type = type::invalid;
|
||
|
|
||
|
/// The number of elements of an aggregate.
|
||
|
std::size_t aggregate_size{};
|
||
|
|
||
|
/// The depth of this node in the response tree.
|
||
|
std::size_t depth{};
|
||
|
|
||
|
/// The actual data. For aggregate types this is usually empty.
|
||
|
String value{};
|
||
|
};
|
||
|
|
||
|
/** @brief Compares a node for equality.
|
||
|
* @relates basic_node
|
||
|
*
|
||
|
* @param a Left hand side node object.
|
||
|
* @param b Right hand side node object.
|
||
|
*/
|
||
|
template <class String>
|
||
|
auto operator==(basic_node<String> const& a, basic_node<String> const& b)
|
||
|
{
|
||
|
return a.aggregate_size == b.aggregate_size
|
||
|
&& a.depth == b.depth
|
||
|
&& a.data_type == b.data_type
|
||
|
&& a.value == b.value;
|
||
|
};
|
||
|
|
||
|
/** @brief A node in the response tree.
|
||
|
* @ingroup high-level-api
|
||
|
*/
|
||
|
using node = basic_node<std::string>;
|
||
|
|
||
|
} // boost::redis::resp3
|
||
|
|
||
|
#endif // BOOST_REDIS_RESP3_NODE_HPP
|