7#include <nlohmann/json.hpp>
18namespace TgBot::ApiRequest {
20void appendField(std::vector<HttpFormField>& fields,
const char* name,
const std::string& value);
21void appendField(std::vector<HttpFormField>& fields,
const char* name,
const std::shared_ptr<InputFile>& value);
24void appendField(std::vector<HttpFormField>& fields,
const char* name,
const T& value) {
25 if constexpr (std::is_arithmetic_v<T>) {
26 fields.push_back({ name, std::to_string(value) });
28 fields.push_back({ name, Json::encode(value).dump() });
33void appendField(std::vector<HttpFormField>& fields,
const char* name,
const std::optional<T>& value) {
35 appendField(fields, name, *value);
40void appendField(std::vector<HttpFormField>& fields,
const char* name,
const std::shared_ptr<T>& value) {
42 fields.push_back({ name, Json::encode(value).dump() });
46template<
typename... T>
47void appendField(std::vector<HttpFormField>& fields,
const char* name,
const std::variant<T...>& value) {
49 [&](
const auto& item) {
50 appendField(fields, name, item);
56requires std::is_arithmetic_v<T>
57void appendOptionalField(std::vector<HttpFormField>& fields,
const char* name, T value) {
59 appendField(fields, name, value);
63void appendOptionalField(std::vector<HttpFormField>& fields,
const char* name,
const std::string& value);
64void appendOptionalField(std::vector<HttpFormField>& fields,
const char* name,
const nlohmann::json& value);
67void appendOptionalField(std::vector<HttpFormField>& fields,
const char* name,
const std::shared_ptr<T>& value) {
69 appendField(fields, name, value);
74void appendOptionalField(std::vector<HttpFormField>& fields,
const char* name,
const std::vector<T>& value) {
76 appendField(fields, name, value);
80template<
typename... T>
81void appendOptionalField(std::vector<HttpFormField>& fields,
const char* name,
const std::variant<T...>& value) {
83 [&](
const auto& item) {
84 appendOptionalField(fields, name, item);
89template<
bool Required,
typename T>
91 static constexpr bool isRequired = Required;
98struct ParameterWithDefault {
99 static constexpr bool isRequired =
false;
107Parameter<true, T> required(
const char* name,
const T& value) {
108 return { name, value };
112Parameter<false, T> optional(
const char* name,
const T& value) {
113 return { name, value };
117ParameterWithDefault<T> optional(
const char* name,
const T& value, T defaultValue) {
118 return { name, value, std::move(defaultValue) };
121template<
typename... Parameters>
122std::vector<HttpFormField> makeFields(
const Parameters&... parameters) {
123 std::vector<HttpFormField> result;
124 result.reserve(
sizeof...(Parameters));
127 if constexpr (Parameters::isRequired) {
128 appendField(result, parameters.name, parameters.value);
129 }
else if constexpr (
requires { parameters.defaultValue; }) {
130 if (parameters.value != parameters.defaultValue) {
131 appendField(result, parameters.name, parameters.value);
134 appendOptionalField(result, parameters.name, parameters.value);
144namespace TgBot::ApiResponse {
147T decode(
const nlohmann::json& json) {
149 Json::decode(json, result);
155std::shared_ptr<T> decodeObjectOrTrue(
const nlohmann::json& json) {
156 auto result = decode<std::variant<std::shared_ptr<T>,
bool>>(json);
157 if (
auto object = std::get_if<std::shared_ptr<T>>(&result)) {