userver: userver/kafka/headers.hpp Source File
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
headers.hpp
1#pragma once
2
3#include <cstddef>
4#include <iterator>
5#include <string_view>
6
7#include <userver/utils/null_terminated_view.hpp>
8#include <userver/utils/span.hpp>
9
10struct rd_kafka_headers_s;
11
12USERVER_NAMESPACE_BEGIN
13
14namespace kafka {
15
16/// @brief Wrapper for Kafka header.
17/// Header `name` must be valid null-terminated string.
18/// Header `value` is treated as a binary data by Kafka.
19struct HeaderView final {
21 std::string_view value;
22
23 bool operator==(const HeaderView&) const;
24};
25
26/// @brief Owning wrapper for Kafka header.
27class OwningHeader final {
28public:
29 explicit OwningHeader(HeaderView header);
30
31 OwningHeader(std::string name, std::string value);
32
33 const std::string& GetName() const noexcept;
34
35 std::string_view GetValue() const noexcept;
36
37private:
38 std::string name_;
39 std::string value_;
40};
41
42bool operator==(const HeaderView& lhs, const OwningHeader& rhs);
43bool operator==(const OwningHeader& lhs, const HeaderView& rhs);
44
45/// @brief Ordered list of HeaderView.
46/// Duplicated keys are supported.
47/// Keys order is preserved.
48using HeaderViews = utils::span<const HeaderView>;
49
50/// @brief Header views iterator.
51class HeadersIterator {
52public:
53 using iterator_category = std::forward_iterator_tag;
54 using difference_type = std::ptrdiff_t;
55 using value_type = HeaderView;
56 using reference = HeaderView;
57 using pointer = reference*;
58
59 HeadersIterator() = default;
60 HeadersIterator(const rd_kafka_headers_s* headers, std::size_t index);
61
62 HeadersIterator operator++(int);
63 HeadersIterator& operator++();
64
65 reference operator*() const;
66
67 bool operator==(const HeadersIterator&) const;
68 bool operator!=(const HeadersIterator&) const;
69
70private:
71 const rd_kafka_headers_s* headers_{nullptr};
72 std::size_t index_{0};
73};
74
75#if defined(__cpp_concepts)
76static_assert(std::forward_iterator<HeadersIterator>);
77#endif
78
79/// @brief Class to read all message's headers.
80class HeadersReader {
81public:
82 /// @note if `name` passed, only headers with matching name are read.
83 HeadersReader(const rd_kafka_headers_s*);
84
85 HeadersIterator begin() const;
86 HeadersIterator end() const;
87
88 std::size_t size() const noexcept;
89
90private:
91 const rd_kafka_headers_s* headers_{nullptr};
92 std::size_t size_;
93};
94
95} // namespace kafka
96
97USERVER_NAMESPACE_END