GNUnet  0.10.x
json.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet
3  Copyright (C) 2014-2017 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  */
27 #include "platform.h"
28 #include "gnunet_json_lib.h"
29 
30 
44 int
45 GNUNET_JSON_parse(const json_t *root,
46  struct GNUNET_JSON_Specification *spec,
47  const char **error_json_name,
48  unsigned int *error_line)
49 {
50  if (NULL == root)
51  return GNUNET_SYSERR;
52  for (unsigned int i = 0; NULL != spec[i].parser; i++)
53  {
54  json_t *pos;
55 
56  if (NULL == spec[i].field)
57  pos = (json_t *)root;
58  else
59  pos = json_object_get(root, spec[i].field);
60  if ((NULL == pos) && (spec[i].is_optional))
61  continue;
62  if ((NULL == pos) ||
63  (GNUNET_OK != spec[i].parser(spec[i].cls, pos, &spec[i])))
64  {
65  if (NULL != error_json_name)
66  *error_json_name = spec[i].field;
67  if (NULL != error_line)
68  *error_line = i;
70  return GNUNET_SYSERR;
71  }
72  }
73  return GNUNET_OK; /* all OK! */
74 }
75 
76 
85 {
86  struct GNUNET_JSON_Specification ret = spec;
87 
88  ret.is_optional = GNUNET_YES;
89  return ret;
90 }
91 
92 
99 void
101 {
102  for (unsigned int i = 0; NULL != spec[i].parser; i++)
103  if (NULL != spec[i].cleaner)
104  spec[i].cleaner(spec[i].cls, &spec[i]);
105 }
106 
107 
120 static int
122  void *scls,
123  const char *option,
124  const char *value)
125 {
126  json_t **json = scls;
127  json_error_t error;
128 
129  *json = json_loads(value, JSON_REJECT_DUPLICATES, &error);
130  if (NULL == *json)
131  {
132  fprintf(stderr,
133  _("Failed to parse JSON in option `%s': %s (%s)\n"),
134  option,
135  error.text,
136  error.source);
137  return GNUNET_SYSERR;
138  }
139  return GNUNET_OK;
140 }
141 
142 
154  const char *name,
155  const char *argumentHelp,
156  const char *description,
157  json_t **json)
158 {
160  .name = name,
161  .argumentHelp = argumentHelp,
162  .description = description,
163  .require_argument = 1,
164  .processor = &set_json,
165  .scls = (void *)json };
166 
167  return clo;
168 }
169 
170 
171 /* end of json.c */
void * cls
Closure for parser and cleaner.
General context for command line processors.
struct GNUNET_GETOPT_CommandLineOption GNUNET_JSON_getopt(char shortName, const char *name, const char *argumentHelp, const char *description, json_t **json)
Allow user to specify a JSON input value.
Definition: json.c:153
const char * argumentHelp
Name of the argument for the user in help text.
const char * field
Name of the field to parse, use NULL to get the JSON of the main object instead of the JSON of an ind...
functions to parse JSON objects into GNUnet objects
const char * description
Help text for the option (description)
int is_optional
Set to GNUNET_YES if this component is optional.
Entry in parser specification for GNUNET_JSON_parse().
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
Definition of a command line option.
static int ret
Final status code.
Definition: gnunet-arm.c:89
const char shortName
Short name of the option.
static struct GNUNET_DNSSTUB_Context * ctx
Context for DNS resolution.
void GNUNET_JSON_parse_free(struct GNUNET_JSON_Specification *spec)
Frees all elements allocated during a GNUNET_JSON_parse() operation.
Definition: json.c:100
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
static char * value
Value of the record to add/remove.
struct GNUNET_JSON_Specification GNUNET_JSON_spec_mark_optional(struct GNUNET_JSON_Specification spec)
Set the "optional" flag for a parser specification entry.
Definition: json.c:84
static char * option
Name of the option.
Definition: gnunet-config.c:38
GNUNET_JSON_Parser parser
Function for how to parse this type of entry.
int GNUNET_JSON_parse(const json_t *root, struct GNUNET_JSON_Specification *spec, const char **error_json_name, unsigned int *error_line)
Navigate and parse data in a JSON tree.
Definition: json.c:45
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
static int set_json(struct GNUNET_GETOPT_CommandLineProcessorContext *ctx, void *scls, const char *option, const char *value)
Set an option with a JSON value from the command line.
Definition: json.c:121
const char * name
GNUNET_JSON_Cleaner cleaner
Function for how to clean up this type of entry.
#define GNUNET_YES
Definition: gnunet_common.h:77