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-bookmarks.hh"
#include "mu-runtime.hh"
#include "mu-message.hh"
#include "utils/mu-util.h"
#include "utils/mu-str.h"
@ -42,6 +43,7 @@
#include "utils/mu-utils.hh"
using namespace Mu;
using namespace Mu::Message;
struct OutputInfo {
Xapian::docid docid{};
@ -68,36 +70,15 @@ print_internal(const Store& store,
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>
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;
sortid = MU_MSG_FIELD_ID_NONE;
if (opts->sortfield) {
sortid = sort_field_from_string(opts->sortfield, err);
if (sortid == MU_MSG_FIELD_ID_NONE) /* error occurred? */
return Nothing;
const auto sortfield_id{message_field_id(opts->sortfield ? opts->sortfield : "")};
if (!sortfield_id && opts->sortfield) {
g_set_error(err, MU_ERROR_DOMAIN, MU_ERROR_IN_PARAMETERS,
"invvalid sort field: '%s'\n", opts->sortfield);
return Nothing;
}
Mu::QueryFlags qflags{QueryFlags::None};
@ -110,7 +91,7 @@ run_query(const Store& store, const std::string& expr, const MuConfig* opts, GEr
if (opts->threads)
qflags |= QueryFlags::Threading;
return store.run_query(expr, sortid, qflags, opts->maxnum);
return store.run_query(expr, sortfield_id, qflags, opts->maxnum);
}
static gboolean
@ -170,7 +151,8 @@ get_query(const MuConfig* opts, GError** err)
/* params[0] is 'find', actual search params start with [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;
}
@ -234,26 +216,24 @@ output_link(MuMsg* msg, const OutputInfo& info, const MuConfig* opts, GError** e
}
static void
ansi_color_maybe(MuMsgFieldId mfid, gboolean color)
ansi_color_maybe(Field::Id field_id, gboolean color)
{
const char* ansi;
if (!color)
return; /* nothing to do */
switch (mfid) {
case MU_MSG_FIELD_ID_FROM: ansi = MU_COLOR_CYAN; break;
switch (field_id) {
case Field::Id::From: ansi = MU_COLOR_CYAN; break;
case MU_MSG_FIELD_ID_TO:
case MU_MSG_FIELD_ID_CC:
case MU_MSG_FIELD_ID_BCC: ansi = MU_COLOR_BLUE; break;
case MU_MSG_FIELD_ID_SUBJECT: ansi = MU_COLOR_GREEN; break;
case MU_MSG_FIELD_ID_DATE: ansi = MU_COLOR_MAGENTA; break;
case Field::Id::To:
case Field::Id::Cc:
case Field::Id::Bcc: ansi = MU_COLOR_BLUE; break;
case Field::Id::Subject: ansi = MU_COLOR_GREEN; break;
case Field::Id::Date: ansi = MU_COLOR_MAGENTA; break;
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;
else
ansi = MU_COLOR_RED;
@ -263,7 +243,7 @@ ansi_color_maybe(MuMsgFieldId mfid, gboolean color)
}
static void
ansi_reset_maybe(MuMsgFieldId mfid, gboolean color)
ansi_reset_maybe(Field::Id field_id, gboolean color)
{
if (!color)
return; /* nothing to do */
@ -272,13 +252,13 @@ ansi_reset_maybe(MuMsgFieldId mfid, gboolean color)
}
static const char*
field_string_list(MuMsg* msg, MuMsgFieldId mfid)
field_string_list(MuMsg* msg, Field::Id field_id)
{
char* str;
const GSList* lst;
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)
return NULL;
@ -306,36 +286,36 @@ flags_s(MessageFlags flags)
}
static std::string
display_field(MuMsg* msg, MuMsgFieldId mfid)
display_field(MuMsg* msg, Field::Id field_id)
{
gint64 val;
switch (mu_msg_field_type(mfid)) {
case MU_MSG_FIELD_TYPE_STRING: {
switch (message_field(field_id).type) {
case Field::Type::String: {
const gchar* str;
str = mu_msg_get_field_string(msg, mfid);
str = mu_msg_get_field_string(msg, field_id);
return str ? str : "";
}
case MU_MSG_FIELD_TYPE_INT:
if (mfid == MU_MSG_FIELD_ID_PRIO) {
const auto val = static_cast<char>(mu_msg_get_field_numeric(msg, mfid));
case Field::Type::Integer:
if (field_id == Field::Id::Priority) {
const auto val = static_cast<char>(mu_msg_get_field_numeric(msg, field_id));
const auto prio = message_priority_from_char(val);
return message_priority_name_c_str(prio);
} else if (mfid == MU_MSG_FIELD_ID_FLAGS) {
val = mu_msg_get_field_numeric(msg, mfid);
} else if (field_id == Field::Id::Flags) {
val = mu_msg_get_field_numeric(msg, field_id);
return flags_s(static_cast<MessageFlags>(val));
} 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(
"%c", static_cast<::time_t>(mu_msg_get_field_numeric(msg, mfid)));
case MU_MSG_FIELD_TYPE_BYTESIZE:
val = mu_msg_get_field_numeric(msg, mfid);
"%c", static_cast<::time_t>(mu_msg_get_field_numeric(msg, field_id)));
case Field::Type::ByteSize:
val = mu_msg_get_field_numeric(msg, field_id);
return mu_str_size_s((unsigned)val);
case MU_MSG_FIELD_TYPE_STRING_LIST: {
case Field::Type::StringList: {
const char* str;
str = field_string_list(msg, mfid);
str = field_string_list(msg, field_id);
return str ? str : "";
}
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);
for (myfields = fields, nonempty = 0; *myfields; ++myfields) {
MuMsgFieldId mfid;
mfid = mu_msg_field_id_from_shortcut(*myfields, FALSE);
if (mfid == MU_MSG_FIELD_ID_NONE ||
(!mu_msg_field_xapian_value(mfid) && !mu_msg_field_xapian_contact(mfid)))
const auto id_opt{message_field_id(*myfields)};
if (!id_opt || (!message_field(*id_opt).is_value() &&
!message_field(*id_opt).is_contact()))
nonempty += printf("%c", *myfields);
else {
ansi_color_maybe(mfid, color);
nonempty += mu_util_fputs_encoded(display_field(msg, mfid).c_str(),
ansi_color_maybe(*id_opt, color);
nonempty += mu_util_fputs_encoded(display_field(msg, *id_opt).c_str(),
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)
* 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)
thread_indent(*info.match_info, opts);