cpp-msgpack-rpc 0.2.0
An RPC library implementing MessagePack RPC.
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
32
33namespace msgpack_rpc::util {
34
35namespace impl {
36
37template <typename Iterator>
39 Iterator iterator, const msgpack::object& object);
40
48template <typename Iterator>
50 Iterator iterator, msgpack::type::nil_t /*nil*/) {
51 return copy_string_to_iterator("null", iterator);
52}
53
62template <typename Iterator>
63inline 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
78template <typename Iterator, typename T>
79inline 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
93template <typename Iterator>
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
113template <typename Iterator>
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
135template <typename Iterator>
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
160template <typename Iterator>
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
188template <typename Iterator>
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
212template <typename Iterator>
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:
239 StatusCode::INVALID_ARGUMENT, "Invalid message type.");
240 }
241}
242
243} // namespace impl
244
253template <typename Iterator>
255 Iterator iterator, const msgpack::object& object) {
256 return impl::format_msgpack_object_impl(iterator, object);
257}
258
259} // namespace msgpack_rpc::util
Class of exceptions in cpp-msgpack-rpc library.
Definition of copy_string_to_iterator function.
Definition of MsgpackRPCException class.
Namespace of internal implementations.
Iterator format_msgpack_object_impl(Iterator iterator, const msgpack::object &object)
Format an object in msgpack library.
Namespace of utilities.
Iterator copy_string_to_iterator(std::string_view string, Iterator iterator)
Copy a string to a range of an iterator.
Iterator format_msgpack_object_to(Iterator iterator, const msgpack::object &object)
Format an object in msgpack library.
Definition of StatusCode enumeration.