userver: userver/kafka/headers.hpp Source File
Loading...
Searching...
No Matches
headers.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/kafka/headers.hpp
4/// @brief Kafka message header views and readers
5
6#include <cstddef>
7#include <iterator>
8#include <string_view>
9
10#include <userver/utils/span.hpp>
11#include <userver/utils/zstring_view.hpp>
12
13struct rd_kafka_headers_s;
14
15USERVER_NAMESPACE_BEGIN
16
17namespace kafka {
18
19/// @brief Wrapper for Kafka header.
20/// Header `name` must be valid null-terminated string.
21/// Header `value` is treated as a binary data by Kafka.
22struct HeaderView final {
23 utils::zstring_view name;
24 std::string_view value;
25
26 bool operator==(const HeaderView&) const;
27};
28
29/// @brief Owning wrapper for Kafka header.
30class OwningHeader final {
31public:
32 explicit OwningHeader(HeaderView header);
33
34 OwningHeader(std::string name, std::string value);
35
36 const std::string& GetName() const noexcept;
37
38 std::string_view GetValue() const noexcept;
39
40private:
41 std::string name_;
42 std::string value_;
43};
44
45bool operator==(const HeaderView& lhs, const OwningHeader& rhs);
46bool operator==(const OwningHeader& lhs, const HeaderView& rhs);
47
48/// @brief Ordered list of HeaderView.
49/// Duplicated keys are supported.
50/// Keys order is preserved.
51using HeaderViews = utils::span<const HeaderView>;
52
53/// @brief Header views iterator.
55public:
56 using iterator_category = std::forward_iterator_tag;
57 using difference_type = std::ptrdiff_t;
58 using value_type = HeaderView;
59 using reference = HeaderView;
60 using pointer = reference*;
61
62 HeadersIterator() = default;
63 HeadersIterator(const rd_kafka_headers_s* headers, std::size_t index);
64
65 HeadersIterator operator++(int);
66 HeadersIterator& operator++();
67
68 reference operator*() const;
69
70 bool operator==(const HeadersIterator&) const;
71
72private:
73 const rd_kafka_headers_s* headers_{nullptr};
74 std::size_t index_{0};
75};
76
77static_assert(std::forward_iterator<HeadersIterator>);
78
79/// @brief Class to read all message's headers.
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