9#include <userver/formats/json/parser/base_parser.hpp>
10#include <userver/utils/assert.hpp>
12USERVER_NAMESPACE_BEGIN
14namespace formats::json::
parser {
19 virtual ~Subscriber() =
default;
21 virtual void OnSend(T&&) = 0;
27 SubscriberSink(T& data)
31 void OnSend(T&& value)
override { data_ = std::move(value); }
40 SubscriberSinkOptional(std::optional<T>& data)
44 void OnSend(T&& value)
override { data_ = std::move(value); }
46 void OnSend(std::optional<T>&& value)
override { data_ = std::move(value); }
49 std::optional<T>& data_;
139 void Subscribe(
Subscriber<T>& subscriber) { subscriber_ = &subscriber; }
141 using ResultType = T;
155 void SetResult(T&& value) {
156 parser_state_->PopMe(*
this);
158 subscriber_->OnSend(std::move(value));
168template <
typename Parser>
169typename Parser::ResultType ParseSingle(Parser& parser, std::string_view input) {
170 using ResultType =
typename Parser::ResultType;
174 SubscriberSink<ResultType> sink(result);
175 parser.Subscribe(sink);
178 state.PushParser(parser.GetParser());
179 state.ProcessInput(input);
186template <
typename T,
typename Parser>
187T ParseToType(std::string_view input) {
189 return impl::ParseSingle(parser, input);