]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-reply.c
cli: move config open/close to main() from subcommands
[notmuch] / notmuch-reply.c
index 3a038ed75a06c0a4f76a847f344fec4c94641d53..e151f78a79a406b695da6cf7feeca7917facbc2a 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "notmuch-client.h"
 #include "gmime-filter-headers.h"
+#include "sprinter.h"
 
 static void
 show_reply_headers (GMimeMessage *message)
@@ -547,7 +548,8 @@ notmuch_reply_format_default(void *ctx,
                             notmuch_config_t *config,
                             notmuch_query_t *query,
                             notmuch_show_params_t *params,
-                            notmuch_bool_t reply_all)
+                            notmuch_bool_t reply_all,
+                            unused (sprinter_t *sp))
 {
     GMimeMessage *reply;
     notmuch_messages_t *messages;
@@ -586,11 +588,12 @@ notmuch_reply_format_default(void *ctx,
 }
 
 static int
-notmuch_reply_format_json(void *ctx,
-                         notmuch_config_t *config,
-                         notmuch_query_t *query,
-                         notmuch_show_params_t *params,
-                         notmuch_bool_t reply_all)
+notmuch_reply_format_sprinter(void *ctx,
+                             notmuch_config_t *config,
+                             notmuch_query_t *query,
+                             notmuch_show_params_t *params,
+                             notmuch_bool_t reply_all,
+                             sprinter_t *sp)
 {
     GMimeMessage *reply;
     notmuch_messages_t *messages;
@@ -611,19 +614,20 @@ notmuch_reply_format_json(void *ctx,
     if (!reply)
        return 1;
 
+    sp->begin_map (sp);
+
     /* The headers of the reply message we've created */
-    printf ("{\"reply-headers\": ");
-    format_headers_json (ctx, reply, TRUE);
+    sp->map_key (sp, "reply-headers");
+    format_headers_sprinter (sp, reply, TRUE);
     g_object_unref (G_OBJECT (reply));
     reply = NULL;
 
     /* Start the original */
-    printf (", \"original\": ");
-
-    format_part_json (ctx, node, TRUE);
+    sp->map_key (sp, "original");
+    format_part_sprinter (ctx, sp, node, TRUE, TRUE);
 
     /* End */
-    printf ("}\n");
+    sp->end (sp);
     notmuch_message_destroy (message);
 
     return 0;
@@ -635,7 +639,8 @@ notmuch_reply_format_headers_only(void *ctx,
                                  notmuch_config_t *config,
                                  notmuch_query_t *query,
                                  unused (notmuch_show_params_t *params),
-                                 notmuch_bool_t reply_all)
+                                 notmuch_bool_t reply_all,
+                                 unused (sprinter_t *sp))
 {
     GMimeMessage *reply;
     notmuch_messages_t *messages;
@@ -692,18 +697,23 @@ notmuch_reply_format_headers_only(void *ctx,
 enum {
     FORMAT_DEFAULT,
     FORMAT_JSON,
+    FORMAT_SEXP,
     FORMAT_HEADERS_ONLY,
 };
 
 int
-notmuch_reply_command (void *ctx, int argc, char *argv[])
+notmuch_reply_command (notmuch_config_t *config, int argc, char *argv[])
 {
-    notmuch_config_t *config;
     notmuch_database_t *notmuch;
     notmuch_query_t *query;
     char *query_string;
     int opt_index, ret = 0;
-    int (*reply_format_func)(void *ctx, notmuch_config_t *config, notmuch_query_t *query, notmuch_show_params_t *params, notmuch_bool_t reply_all);
+    int (*reply_format_func) (void *ctx,
+                             notmuch_config_t *config,
+                             notmuch_query_t *query,
+                             notmuch_show_params_t *params,
+                             notmuch_bool_t reply_all,
+                             struct sprinter *sp);
     notmuch_show_params_t params = {
        .part = -1,
        .crypto = {
@@ -713,13 +723,16 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
     };
     int format = FORMAT_DEFAULT;
     int reply_all = TRUE;
+    struct sprinter *sp = NULL;
 
     notmuch_opt_desc_t options[] = {
        { NOTMUCH_OPT_KEYWORD, &format, "format", 'f',
          (notmuch_keyword_t []){ { "default", FORMAT_DEFAULT },
                                  { "json", FORMAT_JSON },
+                                 { "sexp", FORMAT_SEXP },
                                  { "headers-only", FORMAT_HEADERS_ONLY },
                                  { 0, 0 } } },
+       { NOTMUCH_OPT_INT, &notmuch_format_version, "format-version", 0, 0 },
        { NOTMUCH_OPT_KEYWORD, &reply_all, "reply-to", 'r',
          (notmuch_keyword_t []){ { "all", TRUE },
                                  { "sender", FALSE },
@@ -734,18 +747,21 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
        return 1;
     }
 
-    if (format == FORMAT_HEADERS_ONLY)
+    if (format == FORMAT_HEADERS_ONLY) {
        reply_format_func = notmuch_reply_format_headers_only;
-    else if (format == FORMAT_JSON)
-       reply_format_func = notmuch_reply_format_json;
-    else
+    } else if (format == FORMAT_JSON) {
+       reply_format_func = notmuch_reply_format_sprinter;
+       sp = sprinter_json_create (config, stdout);
+    } else if (format == FORMAT_SEXP) {
+       reply_format_func = notmuch_reply_format_sprinter;
+       sp = sprinter_sexp_create (config, stdout);
+    } else {
        reply_format_func = notmuch_reply_format_default;
+    }
 
-    config = notmuch_config_open (ctx, NULL, NULL);
-    if (config == NULL)
-       return 1;
+    notmuch_exit_if_unsupported_format ();
 
-    query_string = query_string_from_args (ctx, argc-opt_index, argv+opt_index);
+    query_string = query_string_from_args (config, argc-opt_index, argv+opt_index);
     if (query_string == NULL) {
        fprintf (stderr, "Out of memory\n");
        return 1;
@@ -766,7 +782,7 @@ notmuch_reply_command (void *ctx, int argc, char *argv[])
        return 1;
     }
 
-    if (reply_format_func (ctx, config, query, &params, reply_all) != 0)
+    if (reply_format_func (config, config, query, &params, reply_all, sp) != 0)
        return 1;
 
     notmuch_crypto_cleanup (&params.crypto);