summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gmail.com>2022-10-11 13:27:11 +0000
committerEmmanuele Bassi <ebassi@gmail.com>2022-10-11 13:27:11 +0000
commitdd400951d9372a97567d62fb61c431a5c9eba7c1 (patch)
tree89f38fc8c200356b1536277d2e08683b9906ff95
parenteeb508e64577d6123875b4fb6d7684b87555f10a (diff)
parent20cb41d88f1ddb71b90f6b0db7dbfc6709305bb7 (diff)
downloadjson-glib-dd400951d9372a97567d62fb61c431a5c9eba7c1.tar.gz
Merge branch 'feature/json-node-accessor' into 'master'
Add new api json_reader_get_current_node Closes #9 See merge request GNOME/json-glib!52
-rw-r--r--README.md4
-rw-r--r--json-glib/json-reader.c19
-rw-r--r--json-glib/json-reader.h2
-rw-r--r--json-glib/tests/reader.c39
4 files changed, 62 insertions, 2 deletions
diff --git a/README.md b/README.md
index 5ecf45f..2eb9044 100644
--- a/README.md
+++ b/README.md
@@ -42,8 +42,8 @@ Build and installation
To build JSON-GLib just run:
```sh
- $ meson _build .
- $ meson -C _build
+ $ meson setup _build .
+ $ meson compile -C _build
$ meson test -C _build
$ meson install -C _build
```
diff --git a/json-glib/json-reader.c b/json-glib/json-reader.c
index cc10cc8..3e58853 100644
--- a/json-glib/json-reader.c
+++ b/json-glib/json-reader.c
@@ -1117,3 +1117,22 @@ json_reader_get_member_name (JsonReader *reader)
return g_ptr_array_index (reader->priv->members,
reader->priv->members->len - 1);
}
+
+/**
+ * json_reader_get_current_node:
+ * @reader: a reader
+ *
+ * Retrieves the reader node at the current position.
+ *
+ * Return value: (nullable) (transfer none): the current node of the reader
+ *
+ * Since: 1.8
+ */
+JsonNode *
+json_reader_get_current_node (JsonReader *reader)
+{
+ g_return_val_if_fail (JSON_IS_READER (reader), NULL);
+ json_reader_return_val_if_error_set (reader, NULL);
+
+ return reader->priv->current_node;
+}
diff --git a/json-glib/json-reader.h b/json-glib/json-reader.h
index 105e88c..9efe36c 100644
--- a/json-glib/json-reader.h
+++ b/json-glib/json-reader.h
@@ -152,6 +152,8 @@ JSON_AVAILABLE_IN_1_0
gboolean json_reader_get_boolean_value (JsonReader *reader);
JSON_AVAILABLE_IN_1_0
gboolean json_reader_get_null_value (JsonReader *reader);
+JSON_AVAILABLE_IN_1_8
+JsonNode * json_reader_get_current_node (JsonReader *reader);
#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
G_DEFINE_AUTOPTR_CLEANUP_FUNC (JsonReader, g_object_unref)
diff --git a/json-glib/tests/reader.c b/json-glib/tests/reader.c
index 947fbc9..2ad2ec6 100644
--- a/json-glib/tests/reader.c
+++ b/json-glib/tests/reader.c
@@ -9,6 +9,9 @@ static const gchar *test_base_object_data =
static const gchar *test_reader_level_data =
" { \"list\": { \"181195771\": { \"given_url\": \"http://www.gnome.org/json-glib-test\" } } }";
+static const gchar *test_reader_current_node_data =
+" { \"object\": { \"subobject\": { \"key\": \"value\" } } }";
+
/* https://bugzilla.gnome.org/show_bug.cgi?id=758580 */
static const char *test_reader_null_value_data =
"{ \"v\": null }";
@@ -239,6 +242,41 @@ test_reader_skip_bom (void)
g_object_unref (parser);
}
+static void
+test_reader_current_node (void)
+{
+ JsonParser *parser = json_parser_new ();
+ JsonReader *reader = json_reader_new (NULL);
+ JsonNode *current = NULL;
+ gchar* node_string = NULL;
+ const gchar* expected_data = "{\"subobject\":{\"key\":\"value\"}}";
+ GError *error = NULL;
+
+ g_assert_null (json_reader_get_current_node (reader));
+
+ json_parser_load_from_data (parser, test_reader_current_node_data, -1, &error);
+ g_assert_no_error (error);
+
+ json_reader_set_root (reader, json_parser_get_root (parser));
+
+ /* Grab the list */
+ g_assert_true (json_reader_read_member (reader, "object"));
+
+ /* Get the node at the current position */
+ current = json_reader_get_current_node (reader);
+ g_assert_nonnull (current);
+
+ /* Check that it contains the data waited */
+ node_string = json_to_string (current, FALSE);
+ g_assert_cmpstr (node_string, ==, expected_data);
+ g_free (node_string);
+
+ json_reader_end_member (reader);
+
+ g_clear_object (&reader);
+ g_clear_object (&parser);
+}
+
int
main (int argc,
char *argv[])
@@ -251,6 +289,7 @@ main (int argc,
g_test_add_func ("/reader/level", test_reader_level);
g_test_add_func ("/reader/null-value", test_reader_null_value);
g_test_add_func ("/reader/bom", test_reader_skip_bom);
+ g_test_add_func ("/reader/currrent-node", test_reader_current_node);
return g_test_run ();
}