1 #ifndef LIBFILEZILLA_JSON_HEADER
2 #define LIBFILEZILLA_JSON_HEADER
12 #include <type_traits>
32 class FZ_PUBLIC_SYMBOL
json final
35 json() noexcept =
default;
43 return static_cast<json_type>(value_.index());
47 std::string string_value()
const;
56 template<
typename T, std::enable_if_t<std::is_
integral_v<
typename std::decay_t<T>>,
int> = 0>
58 auto v = number_value_o<T>();
65 template<
typename T, std::enable_if_t<std::is_
integral_v<
typename std::decay_t<T>>,
int> = 0>
66 std::optional<T> number_value_o()
const {
67 bool constexpr is_signed = std::is_signed_v<typename std::decay_t<T>>;
68 if constexpr (is_signed) {
69 std::optional<int64_t> tmp = number_value_integer_s();
71 if (tmp >= std::numeric_limits<T>::min() && tmp <= std::numeric_limits<T>::max()) {
72 return static_cast<T
>(*tmp);
77 std::optional<uint64_t> tmp = number_value_integer_u();
79 if (tmp <= std::numeric_limits<T>::max()) {
80 return static_cast<T
>(*tmp);
89 template<
typename T, std::enable_if_t<std::is_
floating_po
int_v<
typename std::decay_t<T>>,
int> = 0>
91 return static_cast<T
>(number_value_double());
95 bool bool_value()
const;
98 void erase(std::string
const& name);
101 json const& operator[](std::string
const& name)
const;
109 json& operator[](std::string
const& name);
112 json const& operator[](
size_t i)
const;
120 json& operator[](
size_t i);
123 size_t children()
const;
126 template<
typename Bool, std::enable_if_t<std::is_same_v<
bool,
typename std::decay_t<Bool>>,
int> = 0>
133 template<
typename T, std::enable_if_t<std::is_
integral_v<T> && !std::is_same_v<
bool,
typename std::decay_t<T>>,
int> = 0>
135 value_.emplace<std::size_t(json_type::number)>(
fz::to_string(n));
143 json& operator=(std::string_view
const& v);
153 explicit operator
bool()
const {
return type() != json_type::none; }
155 bool has_non_null_value()
const {
161 bool is_array()
const {
return type() == fz::json_type::array; }
162 bool is_number()
const {
return type() == fz::json_type::number; }
163 bool is_boolean()
const {
return type() == fz::json_type::boolean; }
170 std::string
to_string(
bool pretty =
false,
size_t depth = 0)
const;
179 void to_string(std::string & ret,
bool pretty =
false,
size_t depth = 0)
const;
185 static json parse(std::string_view
const& v,
size_t max_depth = 20);
186 static json parse(
fz::buffer const& b,
size_t max_depth = 20);
191 void to_string_impl(std::string & ret,
bool pretty =
false,
size_t depth = 0)
const;
193 std::optional<int64_t> number_value_integer_s()
const;
194 std::optional<uint64_t> number_value_integer_u()
const;
195 double number_value_double()
const;
197 bool FZ_PRIVATE_SYMBOL check_type(
json_type t);
198 void FZ_PRIVATE_SYMBOL set_type(
json_type t);
200 static json FZ_PRIVATE_SYMBOL parse(
char const*& p,
char const* end,
size_t max_depth);
202 typedef std::variant<
205 std::map<std::string, json, std::less<>>,
214 template <
bool isconst>
216 using json_ref_t = std::conditional_t<isconst, json const&, json &>;
233 json_ref_t operator*()
const
238 bool operator!=(json_array_iterator::sentinel
const&)
const
240 return idx_ < json_.children();
248 inline json_array_iterator<false> begin(json &j) {
return {j}; }
249 inline json_array_iterator<false>::sentinel end(json &) {
return {}; }
251 inline json_array_iterator<true> begin(json
const& j) {
return {j}; }
252 inline json_array_iterator<true>::sentinel end(json
const&) {
return {}; }
T number_value(T errorval={}) const
Returns number and string values as the passed integer type.
Definition: json.hpp:57
json & operator=(T n)
Sets type to number and assigns value.
Definition: json.hpp:134
std::wstring wstring_value() const
Returns string, number and boolean values as wstring.
Definition: json.hpp:50
std::string to_utf8(std::string_view const &in)
Converts from std::string in native encoding into std::string in UTF-8.
std::wstring to_wstring_from_utf8(std::string_view const &in)
Converts from std::string in UTF-8 into std::wstring.
String types and assorted functions.
json parser/builder
Definition: json.hpp:32
The namespace used by libfilezilla.
Definition: apply.hpp:17
json_type
Types of JSON values.
Definition: json.hpp:18
json & operator=(std::wstring_view const &v)
Sets type to string and assigns value.
Definition: json.hpp:146
The buffer class is a simple buffer where data can be appended at the end and consumed at the front...
Definition: buffer.hpp:26
json & operator=(Bool b)
Sets type to boolean and assigns value.
Definition: json.hpp:127
T number_value() const
Returns number and string values as the passed floating point type.
Definition: json.hpp:90
std::string to_string(std::wstring_view const &in)
Converts from std::wstring into std::string in system encoding.