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