userver: userver/kafka/headers.hpp Source File
Loading...
Searching...
No Matches
headers.hpp
1#pragma once
2
3#include <cstddef>
4#include <iterator>
5#include <string_view>
6
7#include <userver/utils/span.hpp>
8#include <userver/utils/zstring_view.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 {
20 utils::zstring_view name;
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.
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
69private:
70 const rd_kafka_headers_s* headers_{nullptr};
71 std::size_t index_{0};
72};
73
74#if defined(__cpp_concepts)
75static_assert(std::forward_iterator<HeadersIterator>);
76#endif
77
78/// @brief Class to read all message's headers.
80public:
81 /// @note if `name` passed, only headers with matching name are read.
82 HeadersReader(const rd_kafka_headers_s*);
83
84 HeadersIterator begin() const;
85 HeadersIterator end() const;
86
87 std::size_t size() const noexcept;
88
89private:
90 const rd_kafka_headers_s* headers_{nullptr};
91 std::size_t size_;
92};
93
94} // namespace kafka
95
96USERVER_NAMESPACE_END