KiCad PCB EDA Suite
Loading...
Searching...
No Matches
json_serializers.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#ifndef JSON_SERIALIZERS_H_
25#define JSON_SERIALIZERS_H_
26
27#include <nlohmann/json.hpp>
28#include <wx/string.h>
29#include <optional>
30
31NLOHMANN_JSON_NAMESPACE_BEGIN
32namespace detail
33{
34// silly hack to silence warnings about std::char_traits<wxUniChar> not being supported by the standard
35// nolhmann json internally has its own char_traits templated to support some exotic char traits
36template <>
37struct char_traits<wxUniChar> : std::char_traits<char>
38{
39 using char_type = wxUniChar;
40 using int_type = uint32_t; // this is wxwidget's internal data type
41
42 // Redefine to_int_type function
43 static int_type to_int_type( char_type c ) noexcept { return static_cast<int_type>( c ); }
44
45 static char_type to_char_type( int_type i ) noexcept { return static_cast<char_type>( i ); }
46
47 static constexpr int_type eof() noexcept { return static_cast<int_type>( EOF ); }
48};
49} // namespace detail
50NLOHMANN_JSON_NAMESPACE_END
51
52namespace nlohmann
53{
54template <>
55struct adl_serializer<wxString>
56{
57 static void from_json( const json& j, wxString& s )
58 {
59 s = wxString::FromUTF8( j.get<std::string>().c_str() );
60 }
61
62 static void to_json( json& j, const wxString& s ) { j = s.ToUTF8(); }
63};
64
65template <typename T>
66struct adl_serializer<std::optional<T>>
67{
68 static void from_json( const json& j, std::optional<T>& opt )
69 {
70 if( j.is_null() )
71 {
72 opt = std::nullopt;
73 }
74 else
75 {
76 opt = j.template get<T>();
77 }
78 }
79
80 static void to_json( json& j, const std::optional<T>& opt )
81 {
82 if( opt.has_value() )
83 {
84 j = *opt;
85 }
86 else
87 {
88 j = nullptr;
89 }
90 }
91};
92} // namespace nlohmann
93
94
95#endif // JSON_SERIALIZERS_H_
nlohmann::json json
Definition: gerbview.cpp:47
STL namespace.
static char_type to_char_type(int_type i) noexcept
static int_type to_int_type(char_type c) noexcept
static constexpr int_type eof() noexcept
static void to_json(json &j, const std::optional< T > &opt)
static void from_json(const json &j, std::optional< T > &opt)
static void from_json(const json &j, wxString &s)
static void to_json(json &j, const wxString &s)