mu4e/server: get cached list of labels
This will be useful with label commands.
This commit is contained in:
@ -551,19 +551,35 @@ Server::Private::contacts_handler(const Command& cmd)
|
|||||||
mu_debug("sent {} of {} contact(s)", n, store().contacts_cache().size());
|
mu_debug("sent {} of {} contact(s)", n, store().contacts_cache().size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T, typename F>
|
||||||
|
std::string quoted_join(const T& items, F&& func)
|
||||||
|
{
|
||||||
|
std::vector<std::string> vec;
|
||||||
|
|
||||||
|
std::transform(items.begin(), items.end(), std::back_inserter(vec),
|
||||||
|
[&](const auto& item) { return quote(func(item)); });
|
||||||
|
|
||||||
|
return join(vec, " ");
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Server::Private::data_handler(const Command& cmd)
|
Server::Private::data_handler(const Command& cmd)
|
||||||
{
|
{
|
||||||
const auto request_type{unwrap(cmd.symbol_arg(":kind"))};
|
const auto request_type{unwrap(cmd.symbol_arg(":kind"))};
|
||||||
|
|
||||||
if (request_type == "maildirs") {
|
if (request_type == "maildirs")
|
||||||
auto&& out{make_output_stream()};
|
output(mu_format("(:maildirs ({}))",
|
||||||
mu_print(out, "(");
|
quoted_join(store().maildirs(),
|
||||||
for (auto&& mdir: store().maildirs())
|
[](const auto& item) {
|
||||||
mu_println(out, "{}", quote(std::move(mdir)));
|
return item; // identity
|
||||||
mu_print(out, ")");
|
})));
|
||||||
output(mu_format("(:maildirs {})", out.to_string()));
|
else if (request_type == "labels")
|
||||||
} else
|
output(mu_format("(:labels ({}))",
|
||||||
|
quoted_join(store().label_map(),
|
||||||
|
[](const auto& item) {
|
||||||
|
return item.first;
|
||||||
|
})));
|
||||||
|
else
|
||||||
throw Error(Error::Code::InvalidArgument,
|
throw Error(Error::Code::InvalidArgument,
|
||||||
"invalid request type '{}'", request_type);
|
"invalid request type '{}'", request_type);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -154,6 +154,9 @@ but also manually invoked searches."
|
|||||||
:type 'hook
|
:type 'hook
|
||||||
:group 'mu4e-search)
|
:group 'mu4e-search)
|
||||||
|
|
||||||
|
(defvar mu4e-labels-list nil
|
||||||
|
"Cached list of labels.")
|
||||||
|
|
||||||
;; Internals
|
;; Internals
|
||||||
|
|
||||||
;;; History
|
;;; History
|
||||||
|
|||||||
@ -130,6 +130,7 @@ Note: this REPL is not to be confused with the mu REPL as per
|
|||||||
|
|
||||||
;; Cached data
|
;; Cached data
|
||||||
(defvar mu4e-maildir-list)
|
(defvar mu4e-maildir-list)
|
||||||
|
(defvar mu4e-labels-list)
|
||||||
|
|
||||||
;; Handlers are not strictly internal, but are not meant
|
;; Handlers are not strictly internal, but are not meant
|
||||||
;; for overriding outside mu4e. The are mainly for breaking
|
;; for overriding outside mu4e. The are mainly for breaking
|
||||||
@ -470,6 +471,8 @@ The server output is as follows:
|
|||||||
;; get some data
|
;; get some data
|
||||||
((plist-get sexp :maildirs)
|
((plist-get sexp :maildirs)
|
||||||
(setq mu4e-maildir-list (mu4e--server-plist-get sexp :maildirs)))
|
(setq mu4e-maildir-list (mu4e--server-plist-get sexp :maildirs)))
|
||||||
|
((plist-get sexp :labels)
|
||||||
|
(setq mu4e-labels-list (mu4e--server-plist-get sexp :labels)))
|
||||||
|
|
||||||
;; receive an error
|
;; receive an error
|
||||||
((plist-get sexp :error)
|
((plist-get sexp :error)
|
||||||
@ -654,7 +657,7 @@ get at most MAX contacts."
|
|||||||
|
|
||||||
(defun mu4e--server-data (kind)
|
(defun mu4e--server-data (kind)
|
||||||
"Request data of some KIND.
|
"Request data of some KIND.
|
||||||
KIND is a symbol. Currently supported kinds: maildirs."
|
KIND is a symbol. One of maildirs, labels."
|
||||||
(mu4e--server-call-mu
|
(mu4e--server-call-mu
|
||||||
`(data :kind ,kind)))
|
`(data :kind ,kind)))
|
||||||
|
|
||||||
|
|||||||
@ -160,8 +160,9 @@ invoke FUNC (if available) afterwards."
|
|||||||
(add-hook 'mu4e-query-items-updated-hook #'mu4e--main-redraw)
|
(add-hook 'mu4e-query-items-updated-hook #'mu4e--main-redraw)
|
||||||
(setq mu4e--initialized t) ;; last before we call the server.
|
(setq mu4e--initialized t) ;; last before we call the server.
|
||||||
(mu4e--server-ping)
|
(mu4e--server-ping)
|
||||||
;; ask for the maildir-list
|
;; ask for the maildir-list and labels
|
||||||
(mu4e--server-data 'maildirs)
|
(mu4e--server-data 'maildirs)
|
||||||
|
(mu4e--server-data 'labels)
|
||||||
;; maybe request the list of contacts, automatically refreshed after
|
;; maybe request the list of contacts, automatically refreshed after
|
||||||
;; re-indexing
|
;; re-indexing
|
||||||
(mu4e--query-items-refresh 'reset-baseline)
|
(mu4e--query-items-refresh 'reset-baseline)
|
||||||
@ -249,7 +250,9 @@ invoke FUNC (if available) afterwards."
|
|||||||
(unless (and (not (string= mu4e--contacts-tstamp "0"))
|
(unless (and (not (string= mu4e--contacts-tstamp "0"))
|
||||||
(zerop (plist-get info :updated)))
|
(zerop (plist-get info :updated)))
|
||||||
(mu4e--request-contacts-maybe)
|
(mu4e--request-contacts-maybe)
|
||||||
(mu4e--server-data 'maildirs)) ;; update maildir list
|
(mu4e--server-data 'maildirs)
|
||||||
|
(mu4e--server-data 'labels)) ;; update maildir/labels list
|
||||||
|
|
||||||
(mu4e--main-redraw))))
|
(mu4e--main-redraw))))
|
||||||
((plist-get info :message)
|
((plist-get info :message)
|
||||||
(mu4e-index-message "%s" (plist-get info :message))))))
|
(mu4e-index-message "%s" (plist-get info :message))))))
|
||||||
|
|||||||
Reference in New Issue
Block a user