cartulary 0.3.0-alpha.1

The knowledge layer of your project — decisions, issues, docs, all in one place.
Documentation
use crate::domain::model::decision_record::DecisionRecordEdit;
use crate::domain::model::record_ref::DecisionRecordRef;
use crate::domain::model::title::Title;
use crate::domain::usecases::decision_record::DecisionRecordRepository;
use crate::domain::usecases::edit::dr::commit_dr_edits;

/// Outcome of an `edit_decision_record_title` call.
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum EditTitleOutcome {
    /// The title was changed and saved.
    Updated,
    /// The new title equals the current one — no write was performed.
    NoOp,
}

/// Replace the title of an existing decision record.
///
/// Title edits are not tracked in the event log — git history is the audit
/// trail (per DDR-018QWJVHRH35B, only status transitions are journalled).
/// Returns `Err` if the record is not found.
pub fn edit_decision_record_title(
    repo: &dyn DecisionRecordRepository,
    id: &DecisionRecordRef,
    new_title: Title,
) -> anyhow::Result<EditTitleOutcome> {
    let record = repo
        .find_by_id(id)?
        .ok_or_else(|| anyhow::anyhow!("record {id} not found"))?;
    if record.title == new_title {
        return Ok(EditTitleOutcome::NoOp);
    }
    commit_dr_edits(
        repo,
        vec![DecisionRecordEdit::SetTitle {
            record: id.clone(),
            title: new_title,
        }],
    )?;
    Ok(EditTitleOutcome::Updated)
}