diff options
author | Emmanuele Bassi <ebassi@gmail.com> | 2022-10-11 13:27:11 +0000 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gmail.com> | 2022-10-11 13:27:11 +0000 |
commit | dd400951d9372a97567d62fb61c431a5c9eba7c1 (patch) | |
tree | 89f38fc8c200356b1536277d2e08683b9906ff95 | |
parent | eeb508e64577d6123875b4fb6d7684b87555f10a (diff) | |
parent | 20cb41d88f1ddb71b90f6b0db7dbfc6709305bb7 (diff) | |
download | json-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.md | 4 | ||||
-rw-r--r-- | json-glib/json-reader.c | 19 | ||||
-rw-r--r-- | json-glib/json-reader.h | 2 | ||||
-rw-r--r-- | json-glib/tests/reader.c | 39 |
4 files changed, 62 insertions, 2 deletions
@@ -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 (); } |