pub struct Vocabulary { /* private fields */ }Expand description
The event vocabulary, read from share/events.yaml.
use majordomus_cli::session::Vocabulary;
// written as the shipped file is, which is what a repository's own share directory holds
let v = Vocabulary::parse(
"version: 1\nevents:\n - id: session.closed\n emitted_by: session\n requires: [outcome, session_path]\n public: true\n",
).expect("a vocabulary");
assert!(v.knows("session.closed"));
assert!(!v.knows("session.clsoed"), "a typo is not a name");
assert_eq!(v.requires("session.closed"), ["outcome", "session_path"]);
assert!(v.requires("nothing.declared").is_empty());Implementations§
Source§impl Vocabulary
impl Vocabulary
Sourcepub fn load(share_dir: &Path) -> Result<Self, LedgerError>
pub fn load(share_dir: &Path) -> Result<Self, LedgerError>
Read the vocabulary from a share directory — the one the tool was invoked with, never a copy compiled into this module.
use majordomus_cli::session::Vocabulary;
// a directory with no events.yaml is a failure with a path in it, not a default
let empty = tempfile::tempdir().unwrap();
assert!(Vocabulary::load(empty.path()).is_err());Sourcepub fn parse(text: &str) -> Result<Self, String>
pub fn parse(text: &str) -> Result<Self, String>
Parse the vocabulary from the file’s text. A document that declares no event with an id is an error rather than an empty vocabulary, because an empty one would refuse every event and read as “the ledger is broken”.
use majordomus_cli::session::Vocabulary;
assert!(Vocabulary::parse("version: 1\nevents: []\n").is_err());
assert!(Vocabulary::parse("version: 1\nevents:\n - id: session.started\n").is_ok());Sourcepub fn knows(&self, name: &str) -> bool
pub fn knows(&self, name: &str) -> bool
Is name declared? The question mj_ledger_append asks before it writes, so that
a mistyped name is a refusal rather than a durable line every reader ignores.
use majordomus_cli::session::Vocabulary;
let v = Vocabulary::parse("version: 1\nevents:\n - id: session.closed\n").unwrap();
assert!(v.knows("session.closed"));
assert!(!v.knows("session.clsoed"), "a typo is not a name");Sourcepub fn requires(&self, name: &str) -> &[String]
pub fn requires(&self, name: &str) -> &[String]
The payload keys name must carry. Empty for a name that is not declared — the
caller has already been told by Vocabulary::knows, and answering “no
requirements” for an unknown name is what keeps this from being a second refusal.
use majordomus_cli::session::Vocabulary;
let v = Vocabulary::parse(
"version: 1\nevents:\n - id: session.closed\n requires: [outcome, session_path]\n",
).unwrap();
assert_eq!(v.requires("session.closed"), ["outcome", "session_path"]);
assert!(v.requires("nothing.declared").is_empty());Sourcepub fn declared(&self) -> Vec<DeclaredEvent>
pub fn declared(&self) -> Vec<DeclaredEvent>
Every declared event, in the crate’s one canonical order, so two surfaces listing the vocabulary list it the same way.
use majordomus_cli::session::Vocabulary;
let v = Vocabulary::parse(
"version: 1\nevents:\n - id: session.started\n - id: session.closed\n",
).unwrap();
assert_eq!(v.declared().len(), 2);Trait Implementations§
Source§impl Clone for Vocabulary
impl Clone for Vocabulary
Source§fn clone(&self) -> Vocabulary
fn clone(&self) -> Vocabulary
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for Vocabulary
impl Debug for Vocabulary
Source§impl Default for Vocabulary
impl Default for Vocabulary
Source§fn default() -> Vocabulary
fn default() -> Vocabulary
impl Eq for Vocabulary
Source§impl PartialEq for Vocabulary
impl PartialEq for Vocabulary
Source§fn eq(&self, other: &Vocabulary) -> bool
fn eq(&self, other: &Vocabulary) -> bool
self and other values to be equal, and is used by ==.impl StructuralPartialEq for Vocabulary
Auto Trait Implementations§
impl Freeze for Vocabulary
impl RefUnwindSafe for Vocabulary
impl Send for Vocabulary
impl Sync for Vocabulary
impl Unpin for Vocabulary
impl UnsafeUnpin for Vocabulary
impl UnwindSafe for Vocabulary
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.