cartulary 0.3.0-alpha.1

The knowledge layer of your project — decisions, issues, docs, all in one place.
Documentation
//! Verb-shaped CLI helpers shared by `commands/issue/*` and
//! `commands/decision_record/*`. Each module owns the argument parsing,
//! the structured output envelope and the human-readable rendering for
//! one verb; the per-family files are thin shims that supply the typed
//! id parser, the repository, and the use-case dispatcher.

pub(super) mod body;
pub(super) mod created;
pub(super) mod link;
pub(super) mod status;
pub(super) mod tag;
pub(super) mod title;

/// Render `noun` prefixed by the right English indefinite article
/// (`a` / `an`). Used by every verb's `about` and `long_about` strings
/// so the help text stays grammatical regardless of the family.
pub(crate) fn indefinite(noun: &str) -> String {
    let starts_with_vowel = noun
        .chars()
        .next()
        .is_some_and(|c| matches!(c.to_ascii_lowercase(), 'a' | 'e' | 'i' | 'o' | 'u'));
    let article = if starts_with_vowel { "an" } else { "a" };
    format!("{article} {noun}")
}