cpp-msgpack-rpc
0.2.0
An RPC library implementing MessagePack RPC.
Toggle main menu visibility
Loading...
Searching...
No Matches
format_msgpack_object_to.h
Go to the documentation of this file.
1
/*
2
* Copyright 2023 MusicScience37 (Kenta Kabashima)
3
*
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
7
*
8
* http://www.apache.org/licenses/LICENSE-2.0
9
*
10
* Unless required by applicable law or agreed to in writing, software
11
* distributed under the License is distributed on an "AS IS" BASIS,
12
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
15
*/
20
#pragma once
21
22
#include <cstdint>
23
#include <string_view>
24
#include <type_traits>
25
26
#include <fmt/format.h>
// IWYU pragma: keep
27
#include <msgpack.hpp>
28
29
#include "
msgpack_rpc/common/msgpack_rpc_exception.h
"
30
#include "
msgpack_rpc/common/status_code.h
"
31
#include "
msgpack_rpc/util/copy_string_to_iterator.h
"
32
33
namespace
msgpack_rpc::util
{
34
35
namespace
impl
{
36
37
template
<
typename
Iterator>
38
Iterator
format_msgpack_object_impl
(
39
Iterator iterator,
const
msgpack::object&
object
);
40
48
template
<
typename
Iterator>
49
inline
Iterator
format_msgpack_object_impl
(
50
Iterator iterator, msgpack::type::nil_t
/*nil*/
) {
51
return
copy_string_to_iterator
(
"null"
, iterator);
52
}
53
62
template
<
typename
Iterator>
63
inline
Iterator
format_msgpack_object_impl
(Iterator iterator,
bool
object
) {
64
if
(
object
) {
65
return
copy_string_to_iterator
(
"true"
, iterator);
66
}
67
return
copy_string_to_iterator
(
"false"
, iterator);
68
}
69
78
template
<
typename
Iterator,
typename
T>
79
inline
auto
format_msgpack_object_impl
(Iterator iterator, T
object
)
80
-> std::enable_if_t<std::is_integral_v<T> || std::is_floating_point_v<T>,
81
Iterator> {
82
return
fmt::format_to(iterator,
"{}"
,
object
);
83
}
84
93
template
<
typename
Iterator>
94
inline
Iterator
format_msgpack_object_impl
(
95
Iterator iterator,
const
msgpack::object_str&
object
) {
96
*iterator =
'"'
;
97
++iterator;
98
iterator =
copy_string_to_iterator
(
99
std::string_view(
object
.ptr,
object
.size), iterator);
100
*iterator =
'"'
;
101
++iterator;
102
return
iterator;
103
}
104
113
template
<
typename
Iterator>
114
inline
Iterator
format_msgpack_object_impl
(
115
Iterator iterator,
const
msgpack::object_bin&
object
) {
116
iterator =
copy_string_to_iterator
(
"bin("
, iterator);
117
for
(std::uint32_t i = 0; i <
object
.size; ++i) {
118
const
auto
byte
=
static_cast<
std::uint32_t
>
(
119
static_cast<
unsigned
char
>
(
object
.ptr[i]));
120
iterator = fmt::format_to(iterator,
"{:02X}"
,
byte
);
121
}
122
*iterator =
')'
;
123
++iterator;
124
return
iterator;
125
}
126
135
template
<
typename
Iterator>
136
inline
Iterator
format_msgpack_object_impl
(
137
Iterator iterator,
const
msgpack::object_array&
object
) {
138
*iterator =
'['
;
139
++iterator;
140
for
(std::uint32_t i = 0; i <
object
.size; ++i) {
141
if
(i > 0) {
142
*iterator =
','
;
143
*iterator =
' '
;
144
}
145
iterator =
format_msgpack_object_impl
(iterator,
object
.ptr[i]);
146
}
147
*iterator =
']'
;
148
++iterator;
149
return
iterator;
150
}
151
160
template
<
typename
Iterator>
161
inline
Iterator
format_msgpack_object_impl
(
162
Iterator iterator,
const
msgpack::object_map&
object
) {
163
*iterator =
'{'
;
164
++iterator;
165
for
(std::uint32_t i = 0; i <
object
.size; ++i) {
166
if
(i > 0) {
167
*iterator =
','
;
168
*iterator =
' '
;
169
}
170
iterator =
format_msgpack_object_impl
(iterator,
object
.ptr[i].key);
171
*iterator =
':'
;
172
*iterator =
' '
;
173
iterator =
format_msgpack_object_impl
(iterator,
object
.ptr[i].val);
174
}
175
*iterator =
'}'
;
176
++iterator;
177
return
iterator;
178
}
179
188
template
<
typename
Iterator>
189
inline
Iterator
format_msgpack_object_impl
(
190
Iterator iterator,
const
msgpack::object_ext&
object
) {
191
// NOLINTNEXTLINE(bugprone-signed-char-misuse, cert-str34-c): false positive
192
const
auto
type_number =
static_cast<
int
>
(
object
.type());
193
iterator = fmt::format_to(iterator,
"ext({}, "
, type_number);
194
for
(std::uint32_t i = 0; i <
object
.size; ++i) {
195
const
auto
byte
=
static_cast<
std::uint32_t
>
(
196
static_cast<
unsigned
char
>
(
object
.data()[i]));
197
iterator = fmt::format_to(iterator,
"{:02X}"
,
byte
);
198
}
199
*iterator =
')'
;
200
++iterator;
201
return
iterator;
202
}
203
212
template
<
typename
Iterator>
213
inline
Iterator
format_msgpack_object_impl
(
214
Iterator iterator,
const
msgpack::object&
object
) {
215
switch
(
object
.type) {
216
case
msgpack::type::NIL:
217
return
format_msgpack_object_impl
(iterator, msgpack::type::nil_t());
218
case
msgpack::type::BOOLEAN:
219
return
format_msgpack_object_impl
(iterator,
object
.via.boolean);
220
case
msgpack::type::POSITIVE_INTEGER:
221
return
format_msgpack_object_impl
(iterator,
object
.via.u64);
222
case
msgpack::type::NEGATIVE_INTEGER:
223
return
format_msgpack_object_impl
(iterator,
object
.via.i64);
224
case
msgpack::type::FLOAT32:
225
case
msgpack::type::FLOAT64:
226
return
format_msgpack_object_impl
(iterator,
object
.via.f64);
227
case
msgpack::type::STR:
228
return
format_msgpack_object_impl
(iterator,
object
.via.str);
229
case
msgpack::type::BIN:
230
return
format_msgpack_object_impl
(iterator,
object
.via.bin);
231
case
msgpack::type::ARRAY:
232
return
format_msgpack_object_impl
(iterator,
object
.via.array);
233
case
msgpack::type::MAP:
234
return
format_msgpack_object_impl
(iterator,
object
.via.map);
235
case
msgpack::type::EXT:
236
return
format_msgpack_object_impl
(iterator,
object
.via.ext);
237
default
:
238
throw
MsgpackRPCException
(
239
StatusCode::INVALID_ARGUMENT,
"Invalid message type."
);
240
}
241
}
242
243
}
// namespace impl
244
253
template
<
typename
Iterator>
254
inline
Iterator
format_msgpack_object_to
(
255
Iterator iterator,
const
msgpack::object&
object
) {
256
return
impl::format_msgpack_object_impl
(iterator,
object
);
257
}
258
259
}
// namespace msgpack_rpc::util
msgpack_rpc::MsgpackRPCException
Class of exceptions in cpp-msgpack-rpc library.
Definition
msgpack_rpc_exception.h:35
copy_string_to_iterator.h
Definition of copy_string_to_iterator function.
msgpack_rpc_exception.h
Definition of MsgpackRPCException class.
msgpack_rpc::util::impl
Namespace of internal implementations.
Definition
format_msgpack_object.h:27
msgpack_rpc::util::impl::format_msgpack_object_impl
Iterator format_msgpack_object_impl(Iterator iterator, const msgpack::object &object)
Format an object in msgpack library.
Definition
format_msgpack_object_to.h:213
msgpack_rpc::util
Namespace of utilities.
Definition
format_msgpack_object.h:27
msgpack_rpc::util::copy_string_to_iterator
Iterator copy_string_to_iterator(std::string_view string, Iterator iterator)
Copy a string to a range of an iterator.
Definition
copy_string_to_iterator.h:36
msgpack_rpc::util::format_msgpack_object_to
Iterator format_msgpack_object_to(Iterator iterator, const msgpack::object &object)
Format an object in msgpack library.
Definition
format_msgpack_object_to.h:254
status_code.h
Definition of StatusCode enumeration.
src
msgpack_rpc
util
format_msgpack_object_to.h
Generated on
for cpp-msgpack-rpc by
1.18.0