2012-02-20 01:26:23 +01:00
|
|
|
This file describes the schemata used for notmuch's structured output
|
2012-12-06 22:12:13 +01:00
|
|
|
format (currently JSON and S-Expressions).
|
2012-02-20 01:26:23 +01:00
|
|
|
|
|
|
|
[]'s indicate lists. List items can be marked with a '?', meaning
|
|
|
|
they are optional; or a '*', meaning there can be zero or more of that
|
|
|
|
item. {}'s indicate an object that maps from field identifiers to
|
|
|
|
values. An object field marked '?' is optional. |'s indicate
|
|
|
|
alternates (e.g., int|string means something can be an int or a
|
|
|
|
string).
|
|
|
|
|
2012-12-06 22:12:13 +01:00
|
|
|
For S-Expression output, lists are printed delimited by () instead of
|
|
|
|
[]. Objects are printed as p-lists, i.e. lists where the keys and values
|
|
|
|
are interleaved. Keys are printed as keywords (symbols preceded by a
|
|
|
|
colon), e.g. (:id "123" :time 54321 :from "foobar"). Null is printed as
|
|
|
|
nil, true as t and false as nil.
|
|
|
|
|
2013-10-24 17:19:08 +02:00
|
|
|
This is version 2 of the structured output format.
|
|
|
|
|
|
|
|
Version history
|
|
|
|
---------------
|
|
|
|
|
|
|
|
v1
|
|
|
|
- First versioned schema release.
|
|
|
|
- Added part.content-length and part.content-transfer-encoding fields.
|
|
|
|
|
|
|
|
v2
|
|
|
|
- Added the thread_summary.query field.
|
2012-12-16 04:17:23 +01:00
|
|
|
|
2017-02-25 14:31:31 +01:00
|
|
|
v3
|
|
|
|
- Replaced message.filename string with a list of filenames.
|
|
|
|
|
2012-02-20 01:26:23 +01:00
|
|
|
Common non-terminals
|
|
|
|
--------------------
|
|
|
|
|
|
|
|
# Number of seconds since the Epoch
|
|
|
|
unix_time = int
|
|
|
|
|
|
|
|
# Thread ID, sans "thread:"
|
|
|
|
threadid = string
|
|
|
|
|
|
|
|
# Message ID, sans "id:"
|
|
|
|
messageid = string
|
|
|
|
|
|
|
|
notmuch show schema
|
|
|
|
-------------------
|
|
|
|
|
|
|
|
# A top-level set of threads (do_show)
|
|
|
|
# Returned by notmuch show without a --part argument
|
|
|
|
thread_set = [thread*]
|
|
|
|
|
|
|
|
# Top-level messages in a thread (show_messages)
|
|
|
|
thread = [thread_node*]
|
|
|
|
|
|
|
|
# A message and its replies (show_messages)
|
|
|
|
thread_node = [
|
2012-06-30 13:14:15 +02:00
|
|
|
message|null, # null if not matched and not --entire-thread
|
2012-02-20 01:26:23 +01:00
|
|
|
[thread_node*] # children of message
|
|
|
|
]
|
|
|
|
|
2012-12-06 22:12:12 +01:00
|
|
|
# A message (format_part_sprinter)
|
2012-02-20 01:26:23 +01:00
|
|
|
message = {
|
2012-12-06 22:12:12 +01:00
|
|
|
# (format_message_sprinter)
|
2012-02-20 01:26:23 +01:00
|
|
|
id: messageid,
|
|
|
|
match: bool,
|
2017-02-25 14:31:31 +01:00
|
|
|
filename: [string*],
|
2012-02-20 01:26:23 +01:00
|
|
|
timestamp: unix_time, # date header as unix time
|
|
|
|
date_relative: string, # user-friendly timestamp
|
|
|
|
tags: [string*],
|
|
|
|
|
|
|
|
headers: headers,
|
2012-07-24 20:23:30 +02:00
|
|
|
body?: [part] # omitted if --body=false
|
2012-02-20 01:26:23 +01:00
|
|
|
}
|
|
|
|
|
2012-12-06 22:12:12 +01:00
|
|
|
# A MIME part (format_part_sprinter)
|
2012-02-20 01:26:23 +01:00
|
|
|
part = {
|
|
|
|
id: int|string, # part id (currently DFS part number)
|
|
|
|
|
|
|
|
encstatus?: encstatus,
|
|
|
|
sigstatus?: sigstatus,
|
|
|
|
|
|
|
|
content-type: string,
|
|
|
|
content-id?: string,
|
|
|
|
# if content-type starts with "multipart/":
|
|
|
|
content: [part*],
|
|
|
|
# if content-type is "message/rfc822":
|
|
|
|
content: [{headers: headers, body: [part]}],
|
|
|
|
# otherwise (leaf parts):
|
|
|
|
filename?: string,
|
|
|
|
content-charset?: string,
|
|
|
|
# A leaf part's body content is optional, but may be included if
|
|
|
|
# it can be correctly encoded as a string. Consumers should use
|
|
|
|
# this in preference to fetching the part content separately.
|
2012-12-16 00:24:23 +01:00
|
|
|
content?: string,
|
|
|
|
# If a leaf part's body content is not included, the length of
|
|
|
|
# the encoded content (in bytes) may be given instead.
|
|
|
|
content-length?: int,
|
|
|
|
# If a leaf part's body content is not included, its transfer encoding
|
|
|
|
# may be given. Using this and the encoded content length, it is
|
|
|
|
# possible for the consumer to estimate the decoded content length.
|
|
|
|
content-transfer-encoding?: string
|
2012-02-20 01:26:23 +01:00
|
|
|
}
|
|
|
|
|
2012-12-06 22:12:12 +01:00
|
|
|
# The headers of a message or part (format_headers_sprinter with reply = FALSE)
|
2012-02-20 01:26:23 +01:00
|
|
|
headers = {
|
|
|
|
Subject: string,
|
|
|
|
From: string,
|
|
|
|
To?: string,
|
|
|
|
Cc?: string,
|
|
|
|
Bcc?: string,
|
2012-11-07 16:27:00 +01:00
|
|
|
Reply-To?: string,
|
2012-02-20 01:26:23 +01:00
|
|
|
Date: string
|
|
|
|
}
|
|
|
|
|
2012-12-06 22:12:12 +01:00
|
|
|
# Encryption status (format_part_sprinter)
|
2012-02-20 01:26:23 +01:00
|
|
|
encstatus = [{status: "good"|"bad"}]
|
|
|
|
|
2012-12-06 22:12:12 +01:00
|
|
|
# Signature status (format_part_sigstatus_sprinter)
|
2012-02-20 01:26:23 +01:00
|
|
|
sigstatus = [signature*]
|
|
|
|
|
|
|
|
signature = {
|
2012-04-08 02:57:45 +02:00
|
|
|
# (signature_status_to_string)
|
2012-02-20 01:26:23 +01:00
|
|
|
status: "none"|"good"|"bad"|"error"|"unknown",
|
|
|
|
# if status is "good":
|
|
|
|
fingerprint?: string,
|
|
|
|
created?: unix_time,
|
|
|
|
expires?: unix_time,
|
|
|
|
userid?: string
|
|
|
|
# if status is not "good":
|
|
|
|
keyid?: string
|
|
|
|
# if the signature has errors:
|
|
|
|
errors?: int
|
|
|
|
}
|
|
|
|
|
|
|
|
notmuch search schema
|
|
|
|
---------------------
|
|
|
|
|
|
|
|
# --output=summary
|
2013-10-24 17:19:01 +02:00
|
|
|
search_summary = [thread_summary*]
|
2012-02-20 01:26:23 +01:00
|
|
|
|
|
|
|
# --output=threads
|
2013-10-24 17:19:01 +02:00
|
|
|
search_threads = [threadid*]
|
2012-02-20 01:26:23 +01:00
|
|
|
|
|
|
|
# --output=messages
|
2013-10-24 17:19:01 +02:00
|
|
|
search_messages = [messageid*]
|
2012-02-20 01:26:23 +01:00
|
|
|
|
|
|
|
# --output=files
|
2013-10-24 17:19:01 +02:00
|
|
|
search_files = [string*]
|
2012-02-20 01:26:23 +01:00
|
|
|
|
|
|
|
# --output=tags
|
2013-10-24 17:19:01 +02:00
|
|
|
search_tags = [string*]
|
2012-02-20 01:26:23 +01:00
|
|
|
|
2013-10-24 17:19:01 +02:00
|
|
|
thread_summary = {
|
2012-02-20 01:26:23 +01:00
|
|
|
thread: threadid,
|
|
|
|
timestamp: unix_time,
|
|
|
|
date_relative: string, # user-friendly timestamp
|
|
|
|
matched: int, # number of matched messages
|
|
|
|
total: int, # total messages in thread
|
|
|
|
authors: string, # comma-separated names with | between
|
|
|
|
# matched and unmatched
|
2012-07-03 07:47:38 +02:00
|
|
|
subject: string,
|
2013-10-24 17:19:08 +02:00
|
|
|
tags: [string*],
|
|
|
|
|
|
|
|
# Two stable query strings identifying exactly the matched and
|
|
|
|
# unmatched messages currently in this thread. The messages
|
|
|
|
# matched by these queries will not change even if more messages
|
|
|
|
# arrive in the thread. If there are no matched or unmatched
|
|
|
|
# messages, the corresponding query will be null (there is no
|
|
|
|
# query that matches nothing). (Added in schema version 2.)
|
|
|
|
query: [string|null, string|null],
|
2012-02-20 01:26:23 +01:00
|
|
|
}
|
2012-03-18 17:32:37 +01:00
|
|
|
|
|
|
|
notmuch reply schema
|
|
|
|
--------------------
|
|
|
|
|
|
|
|
reply = {
|
2012-04-08 02:57:45 +02:00
|
|
|
# The headers of the constructed reply
|
2012-03-18 17:32:37 +01:00
|
|
|
reply-headers: reply_headers,
|
|
|
|
|
2012-12-06 22:12:12 +01:00
|
|
|
# As in the show format (format_part_sprinter)
|
2012-03-18 17:32:37 +01:00
|
|
|
original: message
|
|
|
|
}
|
|
|
|
|
2012-12-06 22:12:12 +01:00
|
|
|
# Reply headers (format_headers_sprinter with reply = TRUE)
|
2012-03-18 17:32:37 +01:00
|
|
|
reply_headers = {
|
|
|
|
Subject: string,
|
|
|
|
From: string,
|
|
|
|
To?: string,
|
|
|
|
Cc?: string,
|
|
|
|
Bcc?: string,
|
|
|
|
In-reply-to: string,
|
|
|
|
References: string
|
|
|
|
}
|