mu-scm: add options, some tweaks

Add the (options) procedure + docs.

Some internal tweaks / clean-ups.
This commit is contained in:
Dirk-Jan C. Binnema
2025-06-20 20:31:32 +03:00
parent e647ca924d
commit 812d78be49
7 changed files with 74 additions and 30 deletions

View File

@ -23,6 +23,10 @@ It can either open a shell ("REPL") or run scripts.
Using *mu scm*, you can script *mu*. Using *mu scm*, you can script *mu*.
* SCM OPTIONS
#+include: "muhome.inc" :minlevel 2
#+include: "common-options.inc" :minlevel 1 #+include: "common-options.inc" :minlevel 1
#+include: "exit-code.inc" :minlevel 1 #+include: "exit-code.inc" :minlevel 1

View File

@ -674,7 +674,7 @@ AssocPairs<SubCommand, CommandInfo, Options::SubCommandNum> SubCommandInfos= {{
"remove", "Remove message from file-system and database", sub_remove } "remove", "Remove message from file-system and database", sub_remove }
}, },
{ SubCommand::Scm, { SubCommand::Scm,
{Category::None, {Category::NeedsReadOnlyStore,
"scm", "Start Guile/Scheme shell",sub_scm} "scm", "Start Guile/Scheme shell",sub_scm}
}, },
{ SubCommand::Script, { SubCommand::Script,

View File

@ -142,13 +142,13 @@ Mu::Scm::init_store(const Store& store)
return; return;
store_type = scm_make_foreign_object_type( store_type = scm_make_foreign_object_type(
scm_from_utf8_symbol("store"), make_symbol("store"),
scm_list_1 (scm_from_utf8_symbol("data")), scm_list_1(make_symbol("data")),
{});// no finalizer {});// no finalizer
default_store = scm_make_foreign_object_1( default_store = scm_make_foreign_object_1(
store_type, const_cast<Store*>(&store)); store_type, const_cast<Store*>(&store));
scm_c_define("default-store-object", default_store); scm_c_define("%default-store-object", default_store);
init_subrs(); init_subrs();

View File

@ -53,6 +53,15 @@
(test-end "test-mfind")) (test-end "test-mfind"))
(define (test-misc)
(let ((opts (options)))
(test-assert (>= (length opts) 4))
(test-equal (assoc-ref opts 'quiet) #f)
(test-equal (assoc-ref opts 'debug) #f)
(test-equal (assoc-ref opts 'verbose) #f)
(test-equal (assoc-ref opts 'muhome) #f)))
(define (test-helpers) (define (test-helpers)
(test-begin "test-helpers") (test-begin "test-helpers")
(test-equal 1750077792 (iso-date->time-t "2025-06-16T12:43:12")) (test-equal 1750077792 (iso-date->time-t "2025-06-16T12:43:12"))
@ -70,6 +79,7 @@
(test-basic) (test-basic)
(test-basic-mfind) (test-basic-mfind)
(test-mfind) (test-mfind)
(test-misc)
(test-helpers) (test-helpers)
(test-end "mu-scm-tests") (test-end "mu-scm-tests")

View File

@ -37,26 +37,30 @@ static SCM mu_mod; // The mu module
} }
/** /**
* Create a plist for the relevant configuration items * Create a plist for the relevant option items
* *
* @param opts * @param opts
*/ */
static void static void
init_config (const Options& opts) init_options(const Options& opts)
{ {
scm_c_define("options", SCM scm_opts = alist_add(SCM_EOL,
alist_add(
SCM_EOL,
make_symbol("mu-home"), opts.muhome,
make_symbol("verbose"), opts.verbose, make_symbol("verbose"), opts.verbose,
make_symbol("debug"), opts.debug, make_symbol("debug"), opts.debug,
make_symbol("quiet"), opts.quiet)); make_symbol("quiet"), opts.quiet);
if (opts.muhome.empty())
scm_opts = alist_add(scm_opts, make_symbol("mu-home"), SCM_BOOL_F);
else
scm_opts = alist_add(scm_opts, make_symbol("mu-home"), opts.muhome);
scm_c_define("%options", scm_opts);
} }
static void static void
init_module_mu(void* _data) init_module_mu(void* _data)
{ {
init_config(config->options); init_options(config->options);
init_store(config->store); init_store(config->store);
} }
@ -83,7 +87,6 @@ static std::string mu_scm_path;
static std::string mu_scm_shell_path; static std::string mu_scm_shell_path;
} }
static Result<void> static Result<void>
prepare_run(const Mu::Scm::Config& conf) prepare_run(const Mu::Scm::Config& conf)
{ {

View File

@ -24,7 +24,6 @@
#:export ( #:export (
;; classes ;; classes
<store> <store>
*default-store*
mfind mfind
mcount mcount
@ -69,6 +68,9 @@
cc cc
bcc bcc
;; misc
options
;; helpers ;; helpers
iso-date->time-t iso-date->time-t
time-t->iso-date)) time-t->iso-date))
@ -289,12 +291,12 @@ not found."
;; Store ;; Store
;; ;;
;; Note: we have a *default-store*, which is the store we opened during ;; Note: we have a %default-store, which is the store we opened during
;; startup; for now that's the only store supported, but we keep things ;; startup; for now that's the only store supported, but we keep things
;; open. ;; open.
;; ;;
;; Since it's the default store, we'd like to call the methods without ;; Since it's the default store, we'd like to call the methods without
;; explicitly using *default-store*; with GOOPS, we cannot pass a default for ;; explicitly using %default-store; with GOOPS, we cannot pass a default for
;; that, nor can we use keyword arguments (I think?). So use define* for that. ;; that, nor can we use keyword arguments (I think?). So use define* for that.
;; the 'store-object' is a foreign object wrapping a const Store*. ;; the 'store-object' is a foreign object wrapping a const Store*.
@ -306,23 +308,23 @@ not found."
"Make a store from some STORE-OBJECT." "Make a store from some STORE-OBJECT."
(make <store> #:store-object store-object)) (make <store> #:store-object store-object))
(define *default-store* (define %default-store
;; default-store-object is defined in mu-scm-store.cc ;; %default-store-object is defined in mu-scm-store.cc
(make-store default-store-object)) (make-store %default-store-object))
(define* (mfind query (define* (mfind query
#:key #:key
(store *default-store*) (store %default-store)
(related? #f) (related? #f)
(skip-dups? #f) (skip-dups? #f)
(sort-field 'date) (sort-field 'date)
(reverse? #f) (reverse? #f)
(max-results #f)) (max-results #f))
"Find messages matching some query. The query is mandatory, "Find messages matching some query.
the other (keyword) arguments are optional.
The query is mandatory, the other (keyword) arguments are optional.
(mfind QUERY (mfind QUERY
#:store *default-store*. Leave at default. #:store %default-store. Leave at default.
#:related? include related messages? Default: false #:related? include related messages? Default: false
#:skip-dups? skip duplicates? Default: false #:skip-dups? skip duplicates? Default: false
#:sort-field? field to sort by, a symbol. Default: date #:sort-field? field to sort by, a symbol. Default: date
@ -335,25 +337,36 @@ the other (keyword) arguments are optional.
(define* (mcount (define* (mcount
#:key #:key
(store *default-store*)) (store %default-store))
"Get the number of messages." "Get the number of messages."
(store-mcount (store-object store))) (store-mcount (store-object store)))
(define* (cfind pattern (define* (cfind pattern
#:key #:key
(store *default-store*) (store %default-store)
(personal? #f) (personal? #f)
(after #f) (after #f)
(max-results #f)) (max-results #f))
"Find contacts matching some regex pattern, similar to 'mu-cfind(1). "Find contacts matching some regex pattern, similar to mu-cfind(1).
The pattern is mandatory; the other (keyword) arguments are optional. The pattern is mandatory; the other (keyword) arguments are optional.
(cfind PATTERN (cfind PATTERN
#:store *default-store*. Leave at default. #:store %default-store. Leave at default.
#:personal? only include 'personal' contacts. Default: all #:personal? only include 'personal' contacts. Default: all
#:after only include contacts last seen time_t: Default all #:after only include contacts last seen time_t: Default all
#:max-results max. number of matches. Default: false (unlimited))." #:max-results max. number of matches. Default: false (unlimited))."
(store-cfind (store-object store) pattern personal? after max-results)) (store-cfind (store-object store) pattern personal? after max-results))
;;; Misc
(define (options)
"Get an alist with the general options this instance of \"mu\" started with.
These are based on the command-line arguments, environment etc., see
the mu-scm(1) manpage for details.
The alist maps symbols to values; a value of #f indicates that the value
is at its default."
%options)
;;; Helpers ;;; Helpers

View File

@ -261,6 +261,7 @@ I.e., the information from @code{mu cfind}
@menu @menu
* Store:: the database of all information * Store:: the database of all information
* Message:: inspecting individual messages * Message:: inspecting individual messages
* Miscellaneous:: other functions
* Helpers:: some helper functions * Helpers:: some helper functions
@end menu @end menu
@ -599,6 +600,19 @@ For example:
@c billion-dollar startup on it), but it can be useful for development and @c billion-dollar startup on it), but it can be useful for development and
@c debugging. @c debugging.
@node Miscellaneous
@section Miscellaneous
@deffn {Scheme Procedure} options
@end deffn
This yields an association-list (alist) of general options passed to @command{mu
scm}. Values at @t{#f} indicate that the value is at its default.
@lisp
(options)
=> ((mu-home . #f) (quiet . #f) (debug . #f) (verbose . #f))
@end lisp
@node Helpers @node Helpers
@section Helpers @section Helpers