raft 0.1.0
Loading...
Searching...
No Matches
typed_server.hpp
1#pragma once
2#include <cstddef>
3#include <functional>
4#include <vector>
5
6#include "raft/enhanced/server.hpp"
7
8namespace raft::enhanced::typed
9{
13 template<typename T>
14 std::vector<std::byte> serialize(const T& obj);
15
19 template<typename T, typename E>
20 tl::expected<T, E> deserialize(const std::vector<std::byte>& bytes);
21
23 template<typename T, typename E>
24 concept Serializable = requires(T obj, const std::vector<std::byte>& bytes) {
25 { serialize(obj) } -> std::same_as<std::vector<std::byte>>;
26 { deserialize<T>(bytes) } -> std::same_as<tl::expected<T, E>>;
27 };
28
30 template<typename T, typename E>
31 requires Serializable<T, E>
33 {
34 T data;
35 bool duplicate = false;
36 };
37
40 template<typename T, typename E>
41 requires Serializable<T, E>
42 using LocalCommitCallback =
43 std::function<void(tl::expected<LocalCommitInfo<T, E>, std::variant<Error, E>> result)>;
44
49 template<typename T, typename E>
50 using GlobalCommitCallback =
51 std::function<void(tl::expected<T, E> data, bool local, bool duplicate)>;
52
63 template<typename T, typename E>
64 requires Serializable<T, E>
65 class Server
66 {
67 public:
70 explicit Server(ServerCreateConfig config)
71 : server_(std::move(config))
72 {
73 }
74 ~Server() = default;
75
76 Server(Server const&) = delete;
77 Server& operator=(Server const&) = delete;
78 Server(Server&&) = default;
79 Server& operator=(Server&&) = default;
80
90 void commit(RequestInfo const& info, const T& value, LocalCommitCallback<T, E> callback)
91 {
92 auto serialized = serialize(value);
93 server_.commit(
94 info,
95 serialized,
96 [callback =
97 std::move(callback)](tl::expected<enhanced::LocalCommitInfo, Error> result)
98 {
99 if (result.has_value())
100 {
101 auto deserialized = deserialize<T>(result->data);
102 if (deserialized.has_value())
103 {
104 LocalCommitInfo<T, E> typedInfo {.data = std::move(*deserialized),
105 .duplicate = result->duplicate};
106 callback(std::move(typedInfo));
107 }
108 else
109 {
110 callback(tl::make_unexpected(deserialized.error()));
111 }
112 }
113 else
114 {
115 callback(tl::make_unexpected(result.error()));
116 }
117 });
118 }
119
123 void endSession(std::string const& clientID,
124 std::function<void(tl::expected<void, Error>)> callback)
125 {
126 server_.endSession(clientID, std::move(callback));
127 }
128
136 void setCommitCallback(GlobalCommitCallback<T, E> callback)
137 {
138 server_.setCommitCallback(
139 [callback = std::move(callback)](
140 std::vector<std::byte> data, bool local, bool duplicate)
141 {
142 auto deserialized = deserialize<T>(data);
143 callback(std::move(deserialized), local, duplicate);
144 });
145 }
146
148 void clearCommitCallback() { server_.clearCommitCallback(); }
149
150 private:
152 };
153} // namespace raft::enhanced::typed
Definition server.hpp:69
void commit(RequestInfo const &info, const std::vector< std::byte > &value, LocalCommitCallback callback)
Definition typed_server.hpp:66
void setCommitCallback(GlobalCommitCallback< T, E > callback)
Definition typed_server.hpp:136
void endSession(std::string const &clientID, std::function< void(tl::expected< void, Error >)> callback)
Definition typed_server.hpp:123
void commit(RequestInfo const &info, const T &value, LocalCommitCallback< T, E > callback)
Definition typed_server.hpp:90
void clearCommitCallback()
Clears the global commit callback.
Definition typed_server.hpp:148
Server(ServerCreateConfig config)
Definition typed_server.hpp:70
Concept requiring that a type T can be serialized and deserialized with error type E.
Definition typed_server.hpp:24
Definition server.hpp:18
Configuration for creating an enhanced Raft server.
Definition server.hpp:46
Information about a committed entry with typed data.
Definition typed_server.hpp:33
bool duplicate
Whether the entry was a duplicate.
Definition typed_server.hpp:35
T data
The committed typed data.
Definition typed_server.hpp:34