mirror of
https://git.sr.ht/~rjarry/aerc
synced 2026-03-02 18:23:33 +01:00
aerc is using an unmaintained fork of a not-well-functioning notmuch binding library. Add custom bindings directly into the aerc repo to make them more maintainable and more customizable to our needs. Signed-off-by: Tim Culverhouse <tim@timculverhouse.com> Acked-by: Robin Jarry <robin@jarry.cc>
121 lines
3.1 KiB
Go
121 lines
3.1 KiB
Go
//go:build notmuch
|
|
// +build notmuch
|
|
|
|
package notmuch
|
|
|
|
/*
|
|
#cgo LDFLAGS: -lnotmuch
|
|
|
|
#include <stdlib.h>
|
|
#include <notmuch.h>
|
|
|
|
*/
|
|
import "C"
|
|
import "unsafe"
|
|
|
|
type ExcludeMode int
|
|
|
|
const (
|
|
EXCLUDE_FLAG ExcludeMode = C.NOTMUCH_EXCLUDE_FLAG
|
|
EXCLUDE_TRUE ExcludeMode = C.NOTMUCH_EXCLUDE_TRUE
|
|
EXCLUDE_FALSE ExcludeMode = C.NOTMUCH_EXCLUDE_FALSE
|
|
EXCLUDE_ALL ExcludeMode = C.NOTMUCH_EXCLUDE_ALL
|
|
)
|
|
|
|
type SortMode int
|
|
|
|
const (
|
|
SORT_OLDEST_FIRST SortMode = C.NOTMUCH_SORT_OLDEST_FIRST
|
|
SORT_NEWEST_FIRST SortMode = C.NOTMUCH_SORT_NEWEST_FIRST
|
|
SORT_MESSAGE_ID SortMode = C.NOTMUCH_SORT_MESSAGE_ID
|
|
SORT_UNSORTED SortMode = C.NOTMUCH_SORT_UNSORTED
|
|
)
|
|
|
|
type Query struct {
|
|
query *C.notmuch_query_t
|
|
}
|
|
|
|
// Close frees resources associated with a query. Closing a query release all
|
|
// resources associated with any underlying search (Threads, Messages, etc)
|
|
func (q *Query) Close() {
|
|
C.notmuch_query_destroy(q.query)
|
|
}
|
|
|
|
// Return the string of the query
|
|
func (q *Query) String() string {
|
|
return C.GoString(C.notmuch_query_get_query_string(q.query))
|
|
}
|
|
|
|
// Returns the Database associated with the query. The Path, Config, and Profile
|
|
// values will not be set on the returned valued
|
|
func (q *Query) Database() Database {
|
|
db := C.notmuch_query_get_database(q.query)
|
|
return Database{
|
|
db: db,
|
|
}
|
|
}
|
|
|
|
// Exclude sets the exclusion mode.
|
|
func (q *Query) Exclude(val ExcludeMode) {
|
|
cVal := C.notmuch_exclude_t(val)
|
|
C.notmuch_query_set_omit_excluded(q.query, cVal)
|
|
}
|
|
|
|
// Sort sets the sort order of the results
|
|
func (q *Query) Sort(sort SortMode) {
|
|
cVal := C.notmuch_sort_t(sort)
|
|
C.notmuch_query_set_sort(q.query, cVal)
|
|
}
|
|
|
|
// SortMode returns the current sort order of the results
|
|
func (q *Query) SortMode() SortMode {
|
|
return SortMode(C.notmuch_query_get_sort(q.query))
|
|
}
|
|
|
|
// ExcludeTag adds a tag to exclude from the results
|
|
func (q *Query) ExcludeTag(tag string) error {
|
|
cTag := C.CString(tag)
|
|
defer C.free(unsafe.Pointer(cTag))
|
|
return errorWrap(C.notmuch_query_add_tag_exclude(q.query, cTag))
|
|
}
|
|
|
|
// Threads returns an iterator over the threads that match the query
|
|
func (q *Query) Threads() (Threads, error) {
|
|
var cThreads *C.notmuch_threads_t
|
|
err := errorWrap(C.notmuch_query_search_threads(q.query, &cThreads)) //nolint:gocritic // see note in notmuch.go
|
|
if err != nil {
|
|
return Threads{}, err
|
|
}
|
|
threads := Threads{
|
|
threads: cThreads,
|
|
}
|
|
return threads, nil
|
|
}
|
|
|
|
// Messages returns an iterator over the messages that match the query
|
|
func (q *Query) Messages() (Messages, error) {
|
|
var cMessages *C.notmuch_messages_t
|
|
err := errorWrap(C.notmuch_query_search_messages(q.query, &cMessages)) //nolint:gocritic // see note in notmuch.go
|
|
if err != nil {
|
|
return Messages{}, err
|
|
}
|
|
messages := Messages{
|
|
messages: cMessages,
|
|
}
|
|
return messages, nil
|
|
}
|
|
|
|
// CountMessages returns the number of messages matching the query
|
|
func (q *Query) CountMessages() (int, error) {
|
|
var count C.uint
|
|
err := errorWrap(C.notmuch_query_count_messages(q.query, &count))
|
|
return int(count), err
|
|
}
|
|
|
|
// CountThreads returns the number of threads matching the query
|
|
func (q *Query) CountThreads() (int, error) {
|
|
var count C.uint
|
|
err := errorWrap(C.notmuch_query_count_threads(q.query, &count))
|
|
return int(count), err
|
|
}
|