diff options
author | Emmanuele Bassi <ebassi@gmail.com> | 2017-12-15 16:47:39 +0000 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gmail.com> | 2017-12-15 16:47:39 +0000 |
commit | 20b17f520e33dbc260b96224b8a92917f672fc43 (patch) | |
tree | f4249aa0fde0b2afad4d6dedc693ee38f2e3e00f | |
parent | 2a26b629131b392af18e489cf99f3689281c8d1e (diff) | |
parent | 5b816ff8df9e563c1e9c3ae05ee97d46924f9b40 (diff) | |
download | json-glib-20b17f520e33dbc260b96224b8a92917f672fc43.tar.gz |
Merge branch 'get-with-default' into 'master'
Add JsonObject getters with fallback value
Closes #4
See merge request GNOME/json-glib!4
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | doc/json-glib-sections.txt | 12 | ||||
-rw-r--r-- | json-glib/json-object.c | 205 | ||||
-rw-r--r-- | json-glib/json-types.h | 38 | ||||
-rw-r--r-- | json-glib/json-version-macros.h | 20 | ||||
-rw-r--r-- | json-glib/tests/object.c | 20 | ||||
-rw-r--r-- | meson.build | 2 |
7 files changed, 211 insertions, 90 deletions
@@ -1,3 +1,7 @@ +Overview of changes for 1.6 +============================== +• TBD + Overview of changes for 1.4 ============================== • Use Meson as the only build system diff --git a/doc/json-glib-sections.txt b/doc/json-glib-sections.txt index 44942c4..ada0895 100644 --- a/doc/json-glib-sections.txt +++ b/doc/json-glib-sections.txt @@ -31,18 +31,22 @@ json_object_iter_next <SUBSECTION> json_object_set_array_member json_object_get_array_member +json_object_set_object_member +json_object_get_object_member +json_object_set_null_member +json_object_get_null_member json_object_set_boolean_member json_object_get_boolean_member +json_object_get_boolean_member_with_default json_object_set_double_member json_object_get_double_member +json_object_get_double_member_with_default json_object_set_int_member json_object_get_int_member -json_object_set_null_member -json_object_get_null_member -json_object_set_object_member -json_object_get_object_member +json_object_get_int_member_with_default json_object_set_string_member json_object_get_string_member +json_object_get_string_member_with_default <SUBSECTION Private> JSON_TYPE_OBJECT diff --git a/json-glib/json-object.c b/json-glib/json-object.c index 29b9401..bb33ec0 100644 --- a/json-glib/json-object.c +++ b/json-glib/json-object.c @@ -579,10 +579,50 @@ json_object_get_member (JsonObject *object, return object_get_member_internal (object, member_name); } +#define JSON_OBJECT_GET(ret_type,type_name) \ +ret_type \ +json_object_get_ ##type_name## _member (JsonObject *object, \ + const char *member_name) \ +{ \ + g_return_val_if_fail (object != NULL, (ret_type) 0); \ + g_return_val_if_fail (member_name != NULL, (ret_type) 0); \ +\ + JsonNode *node = object_get_member_internal (object, member_name); \ + g_return_val_if_fail (node != NULL, (ret_type) 0); \ +\ + if (JSON_NODE_HOLDS_NULL (node)) \ + return (ret_type) 0; \ +\ + g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, (ret_type) 0); \ +\ + return json_node_get_ ##type_name (node); \ +} + +#define JSON_OBJECT_GET_DEFAULT(ret_type,type_name) \ +ret_type \ +json_object_get_ ##type_name## _member_with_default (JsonObject *object, \ + const char *member_name, \ + ret_type default_value) \ +{ \ + g_return_val_if_fail (object != NULL, default_value); \ + g_return_val_if_fail (member_name != NULL, default_value); \ +\ + JsonNode *node = object_get_member_internal (object, member_name); \ + if (node == NULL) \ + return default_value; \ +\ + if (JSON_NODE_HOLDS_NULL (node)) \ + return default_value; \ +\ + g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, default_value); \ +\ + return json_node_get_ ##type_name (node); \ +} + /** * json_object_get_int_member: * @object: a #JsonObject - * @member_name: the name of the member + * @member_name: the name of the @object member * * Convenience function that retrieves the integer value * stored in @member_name of @object @@ -593,21 +633,26 @@ json_object_get_member (JsonObject *object, * * Since: 0.8 */ -gint64 -json_object_get_int_member (JsonObject *object, - const gchar *member_name) -{ - JsonNode *node; - - g_return_val_if_fail (object != NULL, 0); - g_return_val_if_fail (member_name != NULL, 0); +JSON_OBJECT_GET (gint64, int) - node = object_get_member_internal (object, member_name); - g_return_val_if_fail (node != NULL, 0); - g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, 0); - - return json_node_get_int (node); -} +/** + * json_object_get_int_member_with_default: + * @object: a #JsonObject + * @member_name: the name of the @object member + * @default_value: the value to return if @member_name is not valid + * + * Convenience function that retrieves the integer value + * stored in @member_name of @object. + * + * If @member_name does not exist, does not contain a scalar value, + * or contains `null`, then @default_value is returned instead. + * + * Returns: the integer value of the object's member, or the + * given default + * + * Since: 1.6 + */ +JSON_OBJECT_GET_DEFAULT (gint64, int) /** * json_object_get_double_member: @@ -623,21 +668,26 @@ json_object_get_int_member (JsonObject *object, * * Since: 0.8 */ -gdouble -json_object_get_double_member (JsonObject *object, - const gchar *member_name) -{ - JsonNode *node; - - g_return_val_if_fail (object != NULL, 0.0); - g_return_val_if_fail (member_name != NULL, 0.0); - - node = object_get_member_internal (object, member_name); - g_return_val_if_fail (node != NULL, 0.0); - g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, 0.0); +JSON_OBJECT_GET (gdouble, double) - return json_node_get_double (node); -} +/** + * json_object_get_double_member_with_default: + * @object: a #JsonObject + * @member_name: the name of the @object member + * @default_value: the value to return if @member_name is not valid + * + * Convenience function that retrieves the floating point value + * stored in @member_name of @object. + * + * If @member_name does not exist, does not contain a scalar value, + * or contains `null`, then @default_value is returned instead. + * + * Returns: the floating point value of the object's member, or the + * given default + * + * Since: 1.6 + */ +JSON_OBJECT_GET_DEFAULT (double, double) /** * json_object_get_boolean_member: @@ -653,21 +703,61 @@ json_object_get_double_member (JsonObject *object, * * Since: 0.8 */ -gboolean -json_object_get_boolean_member (JsonObject *object, - const gchar *member_name) -{ - JsonNode *node; +JSON_OBJECT_GET (gboolean, boolean) - g_return_val_if_fail (object != NULL, FALSE); - g_return_val_if_fail (member_name != NULL, FALSE); +/** + * json_object_get_boolean_member_with_default: + * @object: a #JsonObject + * @member_name: the name of the @object member + * @default_value: the value to return if @member_name is not valid + * + * Convenience function that retrieves the boolean value + * stored in @member_name of @object. + * + * If @member_name does not exist, does not contain a scalar value, + * or contains `null`, then @default_value is returned instead. + * + * Returns: the boolean value of the object's member, or the + * given default + * + * Since: 1.6 + */ +JSON_OBJECT_GET_DEFAULT (gboolean, boolean) - node = object_get_member_internal (object, member_name); - g_return_val_if_fail (node != NULL, FALSE); - g_return_val_if_fail (JSON_NODE_TYPE (node) == JSON_NODE_VALUE, FALSE); +/** + * json_object_get_string_member: + * @object: a #JsonObject + * @member_name: the name of the member + * + * Convenience function that retrieves the string value + * stored in @member_name of @object + * + * See also: json_object_get_member() + * + * Return value: the string value of the object's member + * + * Since: 0.8 + */ +JSON_OBJECT_GET (const gchar *, string) - return json_node_get_boolean (node); -} +/** + * json_object_get_string_member_with_default: + * @object: a #JsonObject + * @member_name: the name of the @object member + * @default_value: the value to return if @member_name is not valid + * + * Convenience function that retrieves the string value + * stored in @member_name of @object. + * + * If @member_name does not exist, does not contain a scalar value, + * or contains `null`, then @default_value is returned instead. + * + * Returns: the string value of the object's member, or the + * given default + * + * Since: 1.6 + */ +JSON_OBJECT_GET_DEFAULT (const char *, string) /** * json_object_get_null_member: @@ -708,39 +798,6 @@ json_object_get_null_member (JsonObject *object, } /** - * json_object_get_string_member: - * @object: a #JsonObject - * @member_name: the name of the member - * - * Convenience function that retrieves the string value - * stored in @member_name of @object - * - * See also: json_object_get_member() - * - * Return value: the string value of the object's member - * - * Since: 0.8 - */ -const gchar * -json_object_get_string_member (JsonObject *object, - const gchar *member_name) -{ - JsonNode *node; - - g_return_val_if_fail (object != NULL, NULL); - g_return_val_if_fail (member_name != NULL, NULL); - - node = object_get_member_internal (object, member_name); - g_return_val_if_fail (node != NULL, NULL); - g_return_val_if_fail (JSON_NODE_HOLDS_VALUE (node) || JSON_NODE_HOLDS_NULL (node), NULL); - - if (JSON_NODE_HOLDS_NULL (node)) - return NULL; - - return json_node_get_string (node); -} - -/** * json_object_get_array_member: * @object: a #JsonObject * @member_name: the name of the member diff --git a/json-glib/json-types.h b/json-glib/json-types.h index cd18c66..99d1fb9 100644 --- a/json-glib/json-types.h +++ b/json-glib/json-types.h @@ -358,17 +358,33 @@ JSON_AVAILABLE_IN_1_0 JsonNode * json_object_dup_member (JsonObject *object, const gchar *member_name); JSON_AVAILABLE_IN_1_0 -gint64 json_object_get_int_member (JsonObject *object, - const gchar *member_name); -JSON_AVAILABLE_IN_1_0 -gdouble json_object_get_double_member (JsonObject *object, - const gchar *member_name); -JSON_AVAILABLE_IN_1_0 -gboolean json_object_get_boolean_member (JsonObject *object, - const gchar *member_name); -JSON_AVAILABLE_IN_1_0 -const gchar * json_object_get_string_member (JsonObject *object, - const gchar *member_name); +gint64 json_object_get_int_member (JsonObject *object, + const gchar *member_name); +JSON_AVAILABLE_IN_1_6 +gint64 json_object_get_int_member_with_default (JsonObject *object, + const char *member_name, + gint64 default_value); +JSON_AVAILABLE_IN_1_0 +gdouble json_object_get_double_member (JsonObject *object, + const gchar *member_name); +JSON_AVAILABLE_IN_1_6 +double json_object_get_double_member_with_default (JsonObject *object, + const char *member_name, + double default_value); +JSON_AVAILABLE_IN_1_0 +gboolean json_object_get_boolean_member (JsonObject *object, + const gchar *member_name); +JSON_AVAILABLE_IN_1_6 +gboolean json_object_get_boolean_member_with_default (JsonObject *object, + const char *member_name, + gboolean default_value); +JSON_AVAILABLE_IN_1_0 +const gchar * json_object_get_string_member (JsonObject *object, + const gchar *member_name); +JSON_AVAILABLE_IN_1_6 +const char * json_object_get_string_member_with_default (JsonObject *object, + const char *member_name, + const char *default_value); JSON_AVAILABLE_IN_1_0 gboolean json_object_get_null_member (JsonObject *object, const gchar *member_name); diff --git a/json-glib/json-version-macros.h b/json-glib/json-version-macros.h index fdbcea9..c1c269c 100644 --- a/json-glib/json-version-macros.h +++ b/json-glib/json-version-macros.h @@ -47,6 +47,8 @@ #define JSON_VERSION_1_4 (G_ENCODE_VERSION (1, 4)) +#define JSON_VERSION_1_6 (G_ENCODE_VERSION (1, 6)) + /* evaluates to the current stable version; for development cycles, * this means the next stable target */ @@ -122,6 +124,7 @@ /* XXX: Every new stable minor release should add a set of macros here */ +/* 1.0 */ #if JSON_VERSION_MIN_REQUIRED >= JSON_VERSION_1_0 # define JSON_DEPRECATED_IN_1_0 JSON_DEPRECATED # define JSON_DEPRECATED_IN_1_0_FOR(f) JSON_DEPRECATED_FOR(f) @@ -136,6 +139,7 @@ # define JSON_AVAILABLE_IN_1_0 _JSON_EXTERN #endif +/* 1.2 */ #if JSON_VERSION_MIN_REQUIRED >= JSON_VERSION_1_2 # define JSON_DEPRECATED_IN_1_2 JSON_DEPRECATED # define JSON_DEPRECATED_IN_1_2_FOR(f) JSON_DEPRECATED_FOR(f) @@ -150,6 +154,7 @@ # define JSON_AVAILABLE_IN_1_2 _JSON_EXTERN #endif +/* 1.4 */ #if JSON_VERSION_MIN_REQUIRED >= JSON_VERSION_1_4 # define JSON_DEPRECATED_IN_1_4 JSON_DEPRECATED # define JSON_DEPRECATED_IN_1_4_FOR(f) JSON_DEPRECATED_FOR(f) @@ -164,4 +169,19 @@ # define JSON_AVAILABLE_IN_1_4 _JSON_EXTERN #endif +/* 1.6 */ +#if JSON_VERSION_MIN_REQUIRED >= JSON_VERSION_1_6 +# define JSON_DEPRECATED_IN_1_6 JSON_DEPRECATED +# define JSON_DEPRECATED_IN_1_6_FOR(f) JSON_DEPRECATED_FOR(f) +#else +# define JSON_DEPRECATED_IN_1_6 _JSON_EXTERN +# define JSON_DEPRECATED_IN_1_6_FOR(f) _JSON_EXTERN +#endif + +#if JSON_VERSION_MAX_ALLOWED < JSON_VERSION_1_6 +# define JSON_AVAILABLE_IN_1_6 JSON_UNAVAILABLE(1, 6) +#else +# define JSON_AVAILABLE_IN_1_6 _JSON_EXTERN +#endif + #endif /* __JSON_VERSION_MACROS_H__ */ diff --git a/json-glib/tests/object.c b/json-glib/tests/object.c index 03a478c..772265a 100644 --- a/json-glib/tests/object.c +++ b/json-glib/tests/object.c @@ -71,6 +71,25 @@ test_set_member (void) } static void +test_get_member_default (void) +{ + JsonObject *object = json_object_new (); + + json_object_set_int_member (object, "foo", 42); + json_object_set_boolean_member (object, "bar", TRUE); + json_object_set_string_member (object, "hello", "world"); + + g_assert_cmpint (json_object_get_int_member_with_default (object, "foo", 47), ==, 42); + g_assert_true (json_object_get_boolean_member_with_default (object, "bar", FALSE)); + g_assert_cmpstr (json_object_get_string_member_with_default (object, "hello", "wisconsin"), ==, "world"); + + g_assert_cmpint (json_object_get_int_member_with_default (object, "no", 4), ==, 4); + g_assert_cmpstr (json_object_get_string_member_with_default (object, "doesNotExist", "indeed"), ==, "indeed"); + + json_object_unref (object); +} + +static void test_remove_member (void) { JsonObject *object = json_object_new (); @@ -204,6 +223,7 @@ main (int argc, g_test_add_func ("/object/empty-object", test_empty_object); g_test_add_func ("/object/add-member", test_add_member); g_test_add_func ("/object/set-member", test_set_member); + g_test_add_func ("/object/get-member-default", test_get_member_default); g_test_add_func ("/object/remove-member", test_remove_member); g_test_add_func ("/object/foreach-member", test_foreach_member); g_test_add_func ("/object/iter", test_iter); diff --git a/meson.build b/meson.build index 06048e2..67716cb 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,4 @@ -project('json-glib', 'c', version: '1.4.3', +project('json-glib', 'c', version: '1.5.1', license: 'LGPLv2.1+', default_options: [ 'warning_level=1', |