aboutsummaryrefslogtreecommitdiff
path: root/src/json/json.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/json/json.c')
-rw-r--r--src/json/json.c149
1 files changed, 0 insertions, 149 deletions
diff --git a/src/json/json.c b/src/json/json.c
deleted file mode 100644
index 6d11b4fdd..000000000
--- a/src/json/json.c
+++ /dev/null
@@ -1,149 +0,0 @@
1/*
2 This file is part of GNUnet
3 Copyright (C) 2014-2017, 2021 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20/**
21 * @file json/json.c
22 * @brief functions to parse JSON snippets
23 * @author Florian Dold
24 * @author Benedikt Mueller
25 * @author Christian Grothoff
26 */
27#include "platform.h"
28#include "gnunet_json_lib.h"
29
30
31enum GNUNET_GenericReturnValue
32GNUNET_JSON_parse (const json_t *root,
33 struct GNUNET_JSON_Specification *spec,
34 const char **error_json_name,
35 unsigned int *error_line)
36{
37 if (NULL == root)
38 return GNUNET_SYSERR;
39 for (unsigned int i = 0; NULL != spec[i].parser; i++)
40 {
41 json_t *pos;
42
43 if (NULL == spec[i].field)
44 pos = (json_t *) root;
45 else
46 pos = json_object_get (root,
47 spec[i].field);
48 if ( ( (NULL == pos) ||
49 (json_is_null (pos) ) ) &&
50 (spec[i].is_optional) )
51 continue;
52 if ( (NULL == pos) ||
53 (GNUNET_OK !=
54 spec[i].parser (spec[i].cls,
55 pos,
56 &spec[i])) )
57 {
58 if (NULL != error_json_name)
59 *error_json_name = spec[i].field;
60 else
61 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
62 "Parsing failed for field `%s:%u`\n",
63 spec[i].field,
64 i);
65 if (NULL != error_line)
66 *error_line = i;
67 GNUNET_JSON_parse_free (spec);
68 return GNUNET_SYSERR;
69 }
70 }
71 return GNUNET_OK; /* all OK! */
72}
73
74
75struct GNUNET_JSON_Specification
76GNUNET_JSON_spec_mark_optional (struct GNUNET_JSON_Specification spec)
77{
78 struct GNUNET_JSON_Specification ret = spec;
79
80 ret.is_optional = true;
81 return ret;
82}
83
84
85void
86GNUNET_JSON_parse_free (struct GNUNET_JSON_Specification *spec)
87{
88 for (unsigned int i = 0; NULL != spec[i].parser; i++)
89 if (NULL != spec[i].cleaner)
90 spec[i].cleaner (spec[i].cls,
91 &spec[i]);
92}
93
94
95/**
96 * Set an option with a JSON value from the command line.
97 * A pointer to this function should be passed as part of the
98 * 'struct GNUNET_GETOPT_CommandLineOption' array to initialize options
99 * of this type.
100 *
101 * @param ctx command line processing context
102 * @param scls additional closure (will point to the 'json_t *')
103 * @param option name of the option
104 * @param value actual value of the option as a string.
105 * @return #GNUNET_OK if parsing the value worked
106 */
107static int
108set_json (struct GNUNET_GETOPT_CommandLineProcessorContext *ctx,
109 void *scls,
110 const char *option,
111 const char *value)
112{
113 json_t **json = scls;
114 json_error_t error;
115
116 *json = json_loads (value, JSON_REJECT_DUPLICATES, &error);
117 if (NULL == *json)
118 {
119 fprintf (stderr,
120 _ ("Failed to parse JSON in option `%s': %s (%s)\n"),
121 option,
122 error.text,
123 error.source);
124 return GNUNET_SYSERR;
125 }
126 return GNUNET_OK;
127}
128
129
130struct GNUNET_GETOPT_CommandLineOption
131GNUNET_JSON_getopt (char shortName,
132 const char *name,
133 const char *argumentHelp,
134 const char *description,
135 json_t **json)
136{
137 struct GNUNET_GETOPT_CommandLineOption clo = { .shortName = shortName,
138 .name = name,
139 .argumentHelp = argumentHelp,
140 .description = description,
141 .require_argument = 1,
142 .processor = &set_json,
143 .scls = (void *) json };
144
145 return clo;
146}
147
148
149/* end of json.c */