This is a thin wrapper around the string map iterator API just introduced. --- lib/message-property.cc | 38 +++++++++++++++++++ lib/notmuch.h | 24 ++++++++++++ test/T610-message-property.sh | 87 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+) diff --git a/lib/message-property.cc b/lib/message-property.cc index 21348a3..d2e7d9c 100644 --- a/lib/message-property.cc +++ b/lib/message-property.cc @@ -84,3 +84,41 @@ notmuch_message_remove_property (notmuch_message_t *message, const char *key, co { return _notmuch_message_modify_property (message, key, value, TRUE); } + +notmuch_message_properties_t * +notmuch_message_get_properties (notmuch_message_t *message, const char *key, notmuch_bool_t exact) +{ + notmuch_string_map_t *map; + map = _notmuch_message_property_map (message); + return _notmuch_string_map_iterator_create (map, key, exact); +} + +notmuch_bool_t +notmuch_message_properties_valid (notmuch_message_properties_t *properties) +{ + return _notmuch_string_map_iterator_valid (properties); +} + +void +notmuch_message_properties_move_to_next (notmuch_message_properties_t *properties) +{ + return _notmuch_string_map_iterator_move_to_next (properties); +} + +const char * +notmuch_message_properties_key (notmuch_message_properties_t *properties) +{ + return _notmuch_string_map_iterator_key (properties); +} + +const char * +notmuch_message_properties_value (notmuch_message_properties_t *properties) +{ + return _notmuch_string_map_iterator_value (properties); +} + +void +notmuch_message_properties_destroy (notmuch_message_properties_t *properties) +{ + _notmuch_string_map_iterator_destroy (properties); +} diff --git a/lib/notmuch.h b/lib/notmuch.h index c9e654e..b88f47f 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -1665,6 +1665,30 @@ notmuch_message_add_property (notmuch_message_t *message, const char *key, const notmuch_status_t notmuch_message_remove_property (notmuch_message_t *message, const char *key, const char *value); +typedef struct _notmuch_string_map_iterator notmuch_message_properties_t; + +notmuch_status_t +notmuch_message_remove_property (notmuch_message_t *message, const char *key, const char *value); + +notmuch_message_properties_t * +notmuch_message_get_properties (notmuch_message_t *message, const char *key, notmuch_bool_t exact); + +notmuch_bool_t +notmuch_message_properties_valid (notmuch_message_properties_t *properties); + +void +notmuch_message_properties_move_to_next (notmuch_message_properties_t *properties); + +const char * +notmuch_message_properties_key (notmuch_message_properties_t *properties); + +const char * +notmuch_message_properties_value (notmuch_message_properties_t *properties); + +void +notmuch_message_properties_destroy (notmuch_message_properties_t *properties); + + /** * Is the given 'tags' iterator pointing at a valid tag. * diff --git a/test/T610-message-property.sh b/test/T610-message-property.sh index 45ed66b..1617f1a 100755 --- a/test/T610-message-property.sh +++ b/test/T610-message-property.sh @@ -89,6 +89,93 @@ testkey2 = NULL EOF test_expect_equal_file EXPECTED OUTPUT +test_begin_subtest "notmuch_message_get_properties: empty list" +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +{ + notmuch_message_properties_t *list; + list = notmuch_message_get_properties (message, "nonexistent", TRUE); + printf("valid = %d\n", notmuch_message_properties_valid (list)); + notmuch_message_properties_destroy (list); +} +EOF +cat <<'EOF' >EXPECTED +== stdout == +valid = 0 +== stderr == +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "notmuch_message_properties: one value" +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +{ + notmuch_message_properties_t *list; + + for (list = notmuch_message_get_properties (message, "testkey1", TRUE); + notmuch_message_properties_valid (list); notmuch_message_properties_move_to_next (list)) { + printf("%s\n", notmuch_message_properties_value(list)); + } + notmuch_message_properties_destroy (list); +} +EOF +cat <<'EOF' >EXPECTED +== stdout == +testvalue1 +== stderr == +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "notmuch_message_properties: multiple values" +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +{ + notmuch_message_properties_t *list; + RUN(notmuch_message_add_property (message, "testkey1", "bob")); + RUN(notmuch_message_add_property (message, "testkey1", "testvalue2")); + RUN(notmuch_message_add_property (message, "testkey1", "alice")); + + for (list = notmuch_message_get_properties (message, "testkey1", TRUE); + notmuch_message_properties_valid (list); notmuch_message_properties_move_to_next (list)) { + printf("%s\n", notmuch_message_properties_value(list)); + } + notmuch_message_properties_destroy (list); +} +EOF +cat <<'EOF' >EXPECTED +== stdout == +alice +bob +testvalue1 +testvalue2 +== stderr == +EOF +test_expect_equal_file EXPECTED OUTPUT + +test_begin_subtest "notmuch_message_properties: prefix" +cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} +{ + notmuch_message_properties_t *list; + RUN(notmuch_message_add_property (message, "testkey3", "bob3")); + RUN(notmuch_message_add_property (message, "testkey3", "testvalue3")); + RUN(notmuch_message_add_property (message, "testkey3", "alice3")); + + for (list = notmuch_message_get_properties (message, "testkey", FALSE); + notmuch_message_properties_valid (list); notmuch_message_properties_move_to_next (list)) { + printf("%s\n", notmuch_message_properties_value(list)); + } + notmuch_message_properties_destroy (list); +} +EOF +cat <<'EOF' >EXPECTED +== stdout == +alice +bob +testvalue1 +testvalue2 +alice3 +bob3 +testvalue3 +== stderr == +EOF +test_expect_equal_file EXPECTED OUTPUT test_done -- 2.8.1