+
+notmuch_status_t
+notmuch_config_get_bool (notmuch_database_t *notmuch, notmuch_config_key_t key, notmuch_bool_t *val)
+{
+ const char *key_string, *val_string;
+
+ key_string = _notmuch_config_key_to_string (key);
+ if (! key_string) {
+ return NOTMUCH_STATUS_ILLEGAL_ARGUMENT;
+ }
+
+ val_string = _notmuch_string_map_get (notmuch->config, key_string);
+ if (! val_string) {
+ *val = FALSE;
+ return NOTMUCH_STATUS_SUCCESS;
+ }
+
+ if (strcase_equal (val_string, "false") || strcase_equal (val_string, "no"))
+ *val = FALSE;
+ else if (strcase_equal (val_string, "true") || strcase_equal (val_string, "yes"))
+ *val = TRUE;
+ else
+ return NOTMUCH_STATUS_ILLEGAL_ARGUMENT;
+
+ return NOTMUCH_STATUS_SUCCESS;
+}
+
+static const char *
+_notmuch_config_key_to_string (notmuch_config_key_t key) {
+ switch (key) {
+ case NOTMUCH_CONFIG_DATABASE_PATH:
+ return "database.path";
+ case NOTMUCH_CONFIG_HOOK_DIR:
+ return "database.hook_dir";
+ case NOTMUCH_CONFIG_EXCLUDE_TAGS:
+ return "search.exclude_tags";
+ case NOTMUCH_CONFIG_NEW_TAGS:
+ return "new.tags";
+ case NOTMUCH_CONFIG_NEW_IGNORE:
+ return "new.ignore";
+ case NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS:
+ return "maildir.synchronize_flags";
+ case NOTMUCH_CONFIG_PRIMARY_EMAIL:
+ return "user.primary_email";
+ case NOTMUCH_CONFIG_OTHER_EMAIL:
+ return "user.other_email";
+ case NOTMUCH_CONFIG_USER_NAME:
+ return "user.name";
+ default:
+ return NULL;
+ }
+}
+
+static const char *
+_notmuch_config_default (void *ctx, notmuch_config_key_t key) {
+ char *path;
+
+ switch (key) {
+ case NOTMUCH_CONFIG_DATABASE_PATH:
+ path = getenv ("MAILDIR");
+ if (path)
+ path = talloc_strdup (ctx, path);
+ else
+ path = talloc_asprintf (ctx, "%s/mail",
+ getenv ("HOME"));
+ return path;
+ case NOTMUCH_CONFIG_EXCLUDE_TAGS:
+ return "";
+ case NOTMUCH_CONFIG_NEW_TAGS:
+ return "inbox;unread";
+ case NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS:
+ return "true";
+ case NOTMUCH_CONFIG_HOOK_DIR:
+ case NOTMUCH_CONFIG_NEW_IGNORE:
+ case NOTMUCH_CONFIG_USER_NAME:
+ case NOTMUCH_CONFIG_PRIMARY_EMAIL:
+ case NOTMUCH_CONFIG_OTHER_EMAIL:
+ return NULL;
+ default:
+ case NOTMUCH_CONFIG_LAST:
+ INTERNAL_ERROR ("illegal key enum %d", key);
+ }
+}
+
+notmuch_status_t
+_notmuch_config_load_defaults (notmuch_database_t *notmuch) {
+ notmuch_config_key_t key;
+ for (key = NOTMUCH_CONFIG_FIRST;
+ key < NOTMUCH_CONFIG_LAST;
+ key = notmuch_config_key_t(key + 1)) {
+ const char *val = notmuch_config_get (notmuch, key);
+ const char *key_string = _notmuch_config_key_to_string (key);
+
+ val = _notmuch_string_map_get (notmuch->config, key_string);
+ if (! val) {
+ _notmuch_string_map_set (notmuch->config, key_string, _notmuch_config_default (notmuch, key));
+ }
+ }
+ return NOTMUCH_STATUS_SUCCESS;
+}
+
+const char *
+notmuch_config_get (notmuch_database_t *notmuch, notmuch_config_key_t key) {
+
+ return _notmuch_string_map_get (notmuch->config, _notmuch_config_key_to_string (key));
+}
+
+notmuch_status_t
+notmuch_config_set (notmuch_database_t *notmuch, notmuch_config_key_t key, const char *val) {
+
+ return notmuch_database_set_config (notmuch, _notmuch_config_key_to_string (key), val);
+}
+
+void
+_notmuch_config_cache (notmuch_database_t *notmuch, notmuch_config_key_t key, const char *val) {
+ _notmuch_string_map_set (notmuch->config, _notmuch_config_key_to_string (key), val);
+}