From 8b7e3580c2cd23f38ed897208f0f3471873c0383 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Feb 2025 18:48:44 +0100 Subject: [PATCH 1/4] feat: Add `sentry_value_get_key()` --- include/sentry.h | 6 ++++++ src/sentry_value.c | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/sentry.h b/include/sentry.h index 39f4b2cc7..29eec6922 100644 --- a/include/sentry.h +++ b/include/sentry.h @@ -290,6 +290,12 @@ SENTRY_API sentry_value_t sentry_value_get_by_key_owned( SENTRY_API sentry_value_t sentry_value_get_by_key_owned_n( sentry_value_t value, const char *k, size_t k_len); +/** + * Returns a key in a map by index. If missing or value is not a map, + * an empty string is returned. + */ +SENTRY_API const char *sentry_value_get_key(sentry_value_t value, size_t index); + /** * Looks up a value in a list by index. If missing a null value is returned. * The returned value is borrowed. diff --git a/src/sentry_value.c b/src/sentry_value.c index 1258ee818..44dbdc94e 100644 --- a/src/sentry_value.c +++ b/src/sentry_value.c @@ -778,6 +778,18 @@ sentry_value_get_by_key_owned(sentry_value_t value, const char *k) return rv; } +const char * +sentry_value_get_key(sentry_value_t value, size_t index) { + const thing_t *thing = value_as_thing(value); + if (thing && thing_get_type(thing) == THING_TYPE_OBJECT) { + obj_t *o = thing->payload._ptr; + if (index < o->len) { + return o->pairs[index].k; + } + } + return ""; +} + sentry_value_t sentry_value_get_by_index(sentry_value_t value, size_t index) { From 1ae4abb8ff099631dcc9e3818021b4fff6222e02 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Feb 2025 19:02:31 +0100 Subject: [PATCH 2/4] Formatting --- src/sentry_value.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sentry_value.c b/src/sentry_value.c index 44dbdc94e..f15a5d4b5 100644 --- a/src/sentry_value.c +++ b/src/sentry_value.c @@ -779,7 +779,8 @@ sentry_value_get_by_key_owned(sentry_value_t value, const char *k) } const char * -sentry_value_get_key(sentry_value_t value, size_t index) { +sentry_value_get_key(sentry_value_t value, size_t index) +{ const thing_t *thing = value_as_thing(value); if (thing && thing_get_type(thing) == THING_TYPE_OBJECT) { obj_t *o = thing->payload._ptr; From 0b8b26bfed2ab2881af93f667e9c1199aaab9f41 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Feb 2025 19:57:05 +0100 Subject: [PATCH 3/4] Add tests --- tests/unit/test_value.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unit/test_value.c b/tests/unit/test_value.c index 8e738bc1d..2351b4c51 100644 --- a/tests/unit/test_value.c +++ b/tests/unit/test_value.c @@ -252,8 +252,10 @@ SENTRY_TEST(value_object) sentry_value_t child = sentry_value_get_by_key(val, key); if (i < 10) { TEST_CHECK(sentry_value_as_int32(child) == (int32_t)i); + TEST_CHECK(strcmp(sentry_value_get_key(val, i), key) == 0); } else { TEST_CHECK(sentry_value_is_null(child)); + TEST_CHECK(strlen(sentry_value_get_key(val, i)) == 0); } } From d105f15d47538b2f02be2b6d0f2ea1172a0bf1bd Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Tue, 4 Feb 2025 20:37:05 +0100 Subject: [PATCH 4/4] Update CHANGELOG --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba5eda662..1e8a369c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +**Features**: + +- Add `sentry_value_get_key(value, index)` function. ([#1142](https://github.com/getsentry/sentry-native/pull/1142)) + ## 0.7.20 **Features**: