userver: userver/kafka/message.hpp Source File
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
message.hpp
1#pragma once
2
3#include <chrono>
4#include <optional>
5
6#include <userver/kafka/headers.hpp>
7#include <userver/utils/fast_pimpl.hpp>
8#include <userver/utils/null_terminated_view.hpp>
9#include <userver/utils/span.hpp>
10
11USERVER_NAMESPACE_BEGIN
12
13namespace kafka {
14
15namespace impl {
16
17class ConsumerImpl;
18class MessageHolder;
19
20} // namespace impl
21
22/// @brief Wrapper for polled message data access.
23class Message final {
24public:
25 ~Message();
26
27 Message(Message&&) noexcept;
28 Message& operator=(Message&&) noexcept = delete;
29
30 Message(const Message&) = delete;
31 Message& operator=(const Message&) = delete;
32
33 const std::string& GetTopic() const;
34 std::string_view GetKey() const;
35 std::string_view GetPayload() const;
36 std::optional<std::chrono::milliseconds> GetTimestamp() const;
37 int GetPartition() const;
38 std::int64_t GetOffset() const;
39
40 /// @note Headers are parsed only when accessed first time.
41 ///
42 /// If name `name` passed, only headers with such name returns
43 ///
44 /// Usage example:
45 ///
46 /// - All headers:
47 /// @code
48 /// for (auto header : message.GetHeaders()) { /* use ...header... */}
49 /// @endcode
50 /// - Start own headers
51 /// @code
52 /// auto reader = message.GetHeaders();
53 /// auto headers = std::vector<kafka::OwningHeader>{reader.begin(), reader.end()};
54 /// @endcode
56 HeadersReader GetHeaders() && = delete;
57
58 /// @brief Returns **last** header with given name.
59 /// @warning This operation has O(N) complexity, where N == number of all message headers.
60 std::optional<std::string_view> GetHeader(utils::NullTerminatedView name) const;
61
62private:
63 friend class impl::ConsumerImpl;
64
65 explicit Message(impl::MessageHolder&& message);
66
67 struct MessageData;
68 using DataStorage = utils::FastPimpl<MessageData, 72, 8>;
69
70 DataStorage data_;
71};
72
73using MessageBatchView = utils::span<const Message>;
74
75} // namespace kafka
76
77USERVER_NAMESPACE_END