cmd-find: use mu-message-fields

This commit is contained in:
Dirk-Jan C. Binnema 2022-03-05 00:36:37 +02:00
parent f576fc59b9
commit 65afb207d7
1 changed files with 47 additions and 69 deletions

View File

@ -34,6 +34,7 @@
#include "mu-query.hh" #include "mu-query.hh"
#include "mu-bookmarks.hh" #include "mu-bookmarks.hh"
#include "mu-runtime.hh" #include "mu-runtime.hh"
#include "mu-message.hh"
#include "utils/mu-util.h" #include "utils/mu-util.h"
#include "utils/mu-str.h" #include "utils/mu-str.h"
@ -42,6 +43,7 @@
#include "utils/mu-utils.hh" #include "utils/mu-utils.hh"
using namespace Mu; using namespace Mu;
using namespace Mu::Message;
struct OutputInfo { struct OutputInfo {
Xapian::docid docid{}; Xapian::docid docid{};
@ -68,35 +70,14 @@ print_internal(const Store& store,
return TRUE; return TRUE;
} }
/* returns MU_MSG_FIELD_ID_NONE if there is an error */
static MuMsgFieldId
sort_field_from_string(const char* fieldstr, GError** err)
{
MuMsgFieldId mfid;
mfid = mu_msg_field_id_from_name(fieldstr, FALSE);
/* not found? try a shortcut */
if (mfid == MU_MSG_FIELD_ID_NONE && strlen(fieldstr) == 1)
mfid = mu_msg_field_id_from_shortcut(fieldstr[0], FALSE);
if (mfid == MU_MSG_FIELD_ID_NONE)
g_set_error(err,
MU_ERROR_DOMAIN,
MU_ERROR_IN_PARAMETERS,
"not a valid sort field: '%s'\n",
fieldstr);
return mfid;
}
static Option<QueryResults> static Option<QueryResults>
run_query(const Store& store, const std::string& expr, const MuConfig* opts, GError** err) run_query(const Store& store, const std::string& expr, const MuConfig* opts,
GError** err)
{ {
MuMsgFieldId sortid; const auto sortfield_id{message_field_id(opts->sortfield ? opts->sortfield : "")};
if (!sortfield_id && opts->sortfield) {
sortid = MU_MSG_FIELD_ID_NONE; g_set_error(err, MU_ERROR_DOMAIN, MU_ERROR_IN_PARAMETERS,
if (opts->sortfield) { "invvalid sort field: '%s'\n", opts->sortfield);
sortid = sort_field_from_string(opts->sortfield, err);
if (sortid == MU_MSG_FIELD_ID_NONE) /* error occurred? */
return Nothing; return Nothing;
} }
@ -110,7 +91,7 @@ run_query(const Store& store, const std::string& expr, const MuConfig* opts, GEr
if (opts->threads) if (opts->threads)
qflags |= QueryFlags::Threading; qflags |= QueryFlags::Threading;
return store.run_query(expr, sortid, qflags, opts->maxnum); return store.run_query(expr, sortfield_id, qflags, opts->maxnum);
} }
static gboolean static gboolean
@ -170,7 +151,8 @@ get_query(const MuConfig* opts, GError** err)
/* params[0] is 'find', actual search params start with [1] */ /* params[0] is 'find', actual search params start with [1] */
if (!opts->bookmark && !opts->params[1]) { if (!opts->bookmark && !opts->params[1]) {
g_set_error(err, MU_ERROR_DOMAIN, MU_ERROR_IN_PARAMETERS, "error in parameters"); g_set_error(err, MU_ERROR_DOMAIN, MU_ERROR_IN_PARAMETERS,
"error in parameters");
return Nothing; return Nothing;
} }
@ -234,26 +216,24 @@ output_link(MuMsg* msg, const OutputInfo& info, const MuConfig* opts, GError** e
} }
static void static void
ansi_color_maybe(MuMsgFieldId mfid, gboolean color) ansi_color_maybe(Field::Id field_id, gboolean color)
{ {
const char* ansi; const char* ansi;
if (!color) if (!color)
return; /* nothing to do */ return; /* nothing to do */
switch (mfid) { switch (field_id) {
case MU_MSG_FIELD_ID_FROM: ansi = MU_COLOR_CYAN; break; case Field::Id::From: ansi = MU_COLOR_CYAN; break;
case MU_MSG_FIELD_ID_TO: case Field::Id::To:
case MU_MSG_FIELD_ID_CC: case Field::Id::Cc:
case MU_MSG_FIELD_ID_BCC: ansi = MU_COLOR_BLUE; break; case Field::Id::Bcc: ansi = MU_COLOR_BLUE; break;
case Field::Id::Subject: ansi = MU_COLOR_GREEN; break;
case MU_MSG_FIELD_ID_SUBJECT: ansi = MU_COLOR_GREEN; break; case Field::Id::Date: ansi = MU_COLOR_MAGENTA; break;
case MU_MSG_FIELD_ID_DATE: ansi = MU_COLOR_MAGENTA; break;
default: default:
if (mu_msg_field_type(mfid) == MU_MSG_FIELD_TYPE_STRING) if (message_field(field_id).type != Field::Type::String)
ansi = MU_COLOR_YELLOW; ansi = MU_COLOR_YELLOW;
else else
ansi = MU_COLOR_RED; ansi = MU_COLOR_RED;
@ -263,7 +243,7 @@ ansi_color_maybe(MuMsgFieldId mfid, gboolean color)
} }
static void static void
ansi_reset_maybe(MuMsgFieldId mfid, gboolean color) ansi_reset_maybe(Field::Id field_id, gboolean color)
{ {
if (!color) if (!color)
return; /* nothing to do */ return; /* nothing to do */
@ -272,13 +252,13 @@ ansi_reset_maybe(MuMsgFieldId mfid, gboolean color)
} }
static const char* static const char*
field_string_list(MuMsg* msg, MuMsgFieldId mfid) field_string_list(MuMsg* msg, Field::Id field_id)
{ {
char* str; char* str;
const GSList* lst; const GSList* lst;
static char buf[80]; static char buf[80];
lst = mu_msg_get_field_string_list(msg, mfid); lst = mu_msg_get_field_string_list(msg, field_id);
if (!lst) if (!lst)
return NULL; return NULL;
@ -306,36 +286,36 @@ flags_s(MessageFlags flags)
} }
static std::string static std::string
display_field(MuMsg* msg, MuMsgFieldId mfid) display_field(MuMsg* msg, Field::Id field_id)
{ {
gint64 val; gint64 val;
switch (mu_msg_field_type(mfid)) { switch (message_field(field_id).type) {
case MU_MSG_FIELD_TYPE_STRING: { case Field::Type::String: {
const gchar* str; const gchar* str;
str = mu_msg_get_field_string(msg, mfid); str = mu_msg_get_field_string(msg, field_id);
return str ? str : ""; return str ? str : "";
} }
case MU_MSG_FIELD_TYPE_INT: case Field::Type::Integer:
if (mfid == MU_MSG_FIELD_ID_PRIO) { if (field_id == Field::Id::Priority) {
const auto val = static_cast<char>(mu_msg_get_field_numeric(msg, mfid)); const auto val = static_cast<char>(mu_msg_get_field_numeric(msg, field_id));
const auto prio = message_priority_from_char(val); const auto prio = message_priority_from_char(val);
return message_priority_name_c_str(prio); return message_priority_name_c_str(prio);
} else if (mfid == MU_MSG_FIELD_ID_FLAGS) { } else if (field_id == Field::Id::Flags) {
val = mu_msg_get_field_numeric(msg, mfid); val = mu_msg_get_field_numeric(msg, field_id);
return flags_s(static_cast<MessageFlags>(val)); return flags_s(static_cast<MessageFlags>(val));
} else /* as string */ } else /* as string */
return mu_msg_get_field_string(msg, mfid); return mu_msg_get_field_string(msg, field_id);
case MU_MSG_FIELD_TYPE_TIME_T: case Field::Type::TimeT:
return time_to_string( return time_to_string(
"%c", static_cast<::time_t>(mu_msg_get_field_numeric(msg, mfid))); "%c", static_cast<::time_t>(mu_msg_get_field_numeric(msg, field_id)));
case MU_MSG_FIELD_TYPE_BYTESIZE: case Field::Type::ByteSize:
val = mu_msg_get_field_numeric(msg, mfid); val = mu_msg_get_field_numeric(msg, field_id);
return mu_str_size_s((unsigned)val); return mu_str_size_s((unsigned)val);
case MU_MSG_FIELD_TYPE_STRING_LIST: { case Field::Type::StringList: {
const char* str; const char* str;
str = field_string_list(msg, mfid); str = field_string_list(msg, field_id);
return str ? str : ""; return str ? str : "";
} }
default: g_return_val_if_reached(NULL); default: g_return_val_if_reached(NULL);
@ -404,18 +384,16 @@ output_plain_fields(MuMsg* msg, const char* fields, gboolean color, gboolean thr
g_return_if_fail(fields); g_return_if_fail(fields);
for (myfields = fields, nonempty = 0; *myfields; ++myfields) { for (myfields = fields, nonempty = 0; *myfields; ++myfields) {
MuMsgFieldId mfid; const auto id_opt{message_field_id(*myfields)};
mfid = mu_msg_field_id_from_shortcut(*myfields, FALSE); if (!id_opt || (!message_field(*id_opt).is_value() &&
!message_field(*id_opt).is_contact()))
if (mfid == MU_MSG_FIELD_ID_NONE ||
(!mu_msg_field_xapian_value(mfid) && !mu_msg_field_xapian_contact(mfid)))
nonempty += printf("%c", *myfields); nonempty += printf("%c", *myfields);
else { else {
ansi_color_maybe(mfid, color); ansi_color_maybe(*id_opt, color);
nonempty += mu_util_fputs_encoded(display_field(msg, mfid).c_str(), nonempty += mu_util_fputs_encoded(display_field(msg, *id_opt).c_str(),
stdout); stdout);
ansi_reset_maybe(mfid, color); ansi_reset_maybe(*id_opt, color);
} }
} }
@ -431,7 +409,7 @@ output_plain(MuMsg* msg, const OutputInfo& info, const MuConfig* opts, GError**
/* we reuse the color (whatever that may be) /* we reuse the color (whatever that may be)
* for message-priority for threads, too */ * for message-priority for threads, too */
ansi_color_maybe(MU_MSG_FIELD_ID_PRIO, !opts->nocolor); ansi_color_maybe(Field::Id::Priority, !opts->nocolor);
if (opts->threads && info.match_info) if (opts->threads && info.match_info)
thread_indent(*info.match_info, opts); thread_indent(*info.match_info, opts);