use crate::domain::model::body::Body;
use crate::domain::model::description::Description;
use crate::domain::model::entry_locator::EntryLocator;
use crate::domain::model::entry_origin::EntryOrigin;
use crate::domain::model::record_kind::RecordKind;
use crate::domain::model::record_ref::DecisionRecordRef;
use crate::domain::model::relates::Relates;
use crate::domain::model::tag_list::TagList;
use crate::domain::model::temporal::iso_date::IsoDate;
use crate::domain::model::title::Title;
use super::{DrStatus, EventLog, RecordLinks};
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)]
pub struct DecisionRecord {
pub id: DecisionRecordRef,
pub kind: RecordKind,
pub title: Title,
pub description: Option<Description>,
pub(crate) status: DrStatus,
pub date: IsoDate,
pub(crate) tags: TagList,
pub aliases: Vec<String>,
pub(crate) content: Body,
pub(crate) events: EventLog,
pub(crate) links: RecordLinks,
pub(crate) relates: Relates,
pub origin: EntryOrigin,
pub location: EntryLocator,
}
impl DecisionRecord {
pub fn with_tags(self, tags: TagList) -> Self {
Self { tags, ..self }
}
pub fn with_content(self, content: Body) -> Self {
Self { content, ..self }
}
pub fn with_title(self, title: Title) -> Self {
Self { title, ..self }
}
pub fn with_status(self, status: DrStatus) -> Self {
Self { status, ..self }
}
pub fn with_events(self, events: EventLog) -> Self {
Self { events, ..self }
}
pub fn with_links(self, links: RecordLinks) -> Self {
Self { links, ..self }
}
pub fn with_relates(self, relates: Relates) -> Self {
Self { relates, ..self }
}
pub fn relates(&self) -> &Relates {
&self.relates
}
}
#[cfg(test)]
pub mod strategy {
use super::DecisionRecord;
use crate::domain::model::body::strategy::arb_body;
use crate::domain::model::decision_record::dr_status::strategy::dr_status;
use crate::domain::model::decision_record::record_link::strategy::record_links;
use crate::domain::model::event::strategy::event_log;
use crate::domain::model::record_kind::strategy::record_kind;
use crate::domain::model::record_ref::strategy::decision_record_ref;
use crate::domain::model::relates::strategy::relates;
use crate::domain::model::tag_list::strategy::tag_list;
use crate::domain::model::temporal::iso_date::strategy::iso_date;
use crate::domain::model::title::strategy::arb_title;
use proptest::prelude::*;
pub fn decision_record() -> impl Strategy<Value = DecisionRecord> {
let head = (
decision_record_ref(),
record_kind(),
arb_title(),
proptest::option::of(crate::domain::model::description::strategy::arb_description()),
dr_status(),
iso_date(),
);
let tail = (
tag_list(),
proptest::collection::vec("[A-Z]+-[0-9]{4}", 0..3),
arb_body(),
event_log(),
record_links(),
relates(),
);
(head, tail).prop_map(
|(
(id, kind, title, description, status, date),
(tags, aliases, content, events, links, relates),
)| DecisionRecord {
id,
kind,
title,
description,
status,
date,
tags,
aliases,
content,
events,
links,
relates,
origin: crate::domain::model::entry_origin::EntryOrigin::Local,
location: crate::domain::model::entry_locator::EntryLocator::default(),
},
)
}
}
#[cfg(test)]
mod tests {
use super::*;
use proptest::prelude::*;
proptest! {
#[test]
fn clone_round_trips(r in strategy::decision_record()) {
prop_assert_eq!(r.clone(), r);
}
}
}