1#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
5pub struct Id(pub String); #[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
8pub struct FindingId(pub String); #[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
11pub struct DocPath(pub String);
12
13#[derive(Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
15pub struct Date(pub String);
16
17#[derive(Clone, Debug, PartialEq, Eq, Hash)]
19pub struct Rev(pub String);
20
21#[derive(Clone, Copy, Debug, PartialEq, Eq)]
22pub enum Kind {
23 Decision,
24 Axiom,
25 Invariant,
26 Architecture,
27 Current,
28 Roadmap,
29 Milestone,
30 Evidence,
31 ReviewLog,
32 Evolution,
33 Handoff,
34 Explainer,
35 Index,
36}
37
38#[derive(Clone, Copy, Debug, PartialEq, Eq)]
39pub enum Lifecycle {
40 Draft,
41 Current,
42 Superseded,
43 Historical,
44}
45
46#[derive(Clone, Copy, Debug, PartialEq, Eq)]
47pub enum Authority {
48 Normative,
49 Axiomatic,
50 Descriptive,
51 Prospective,
52 Evidence,
53 Historical,
54 Operational,
55 Explanatory,
56 Navigational,
57}
58
59#[derive(Clone, Copy, Debug, PartialEq, Eq)]
61pub enum Status {
62 Open,
63 Proposed,
64 Accepted,
65 Superseded,
66 Deprecated,
67 Rejected,
68}
69
70#[derive(Clone, Copy, Debug, PartialEq, Eq)]
71pub enum Impl {
72 Absent,
73 Scaffold,
74 Partial,
75 Implemented,
76 Verified,
77}
78
79#[derive(Clone, Copy, Debug, PartialEq, Eq)]
80pub enum Door {
81 Reversible,
82 OneWay,
83}
84
85#[derive(Clone, Debug)]
87pub enum Facet {
88 Decision(DecisionFacet),
89 Axiom,
91 Canon {
93 implementation: Option<Impl>,
94 code_revision: Option<Rev>,
95 },
96 Current {
97 implementation: Impl,
98 code_revision: Rev,
99 source_revision: Option<Rev>,
100 },
101 Plan {
103 implementation: Impl,
104 code_revision: Rev,
105 },
106 Evidence {
107 measured: Option<(Impl, Rev)>,
108 source_revision: Option<Rev>,
109 },
110 Narrative,
112}
113
114#[derive(Clone, Debug)]
115pub struct DecisionFacet {
116 pub status: Status,
117 pub date: Date,
118 pub implementation: Option<Impl>,
120 pub fork: Option<Fork>,
122 pub realized_by: Vec<Id>,
124}
125
126#[derive(Clone, Debug)]
127pub struct Fork {
128 pub lean: String,
129 pub decide_when: String,
130 pub door: Door,
131}
132
133impl Facet {
134 pub fn code_revision(&self) -> Option<&Rev> {
136 match self {
137 Facet::Current { code_revision, .. } | Facet::Plan { code_revision, .. } => {
138 Some(code_revision)
139 }
140 Facet::Canon { code_revision, .. } => code_revision.as_ref(),
141 Facet::Evidence { measured, .. } => measured.as_ref().map(|(_, rev)| rev),
142 _ => None,
143 }
144 }
145}
146
147#[derive(Clone, Debug, Default)]
149pub struct Edges {
150 pub depends_on: Vec<Id>,
151 pub supersedes: Vec<Id>,
152 pub related: Vec<Id>,
153 pub supports: Vec<Id>,
154 pub driven_by: Vec<FindingId>,
155}
156
157#[derive(Clone, Debug, Default)]
159pub struct Body {
160 pub bare_mentions: Vec<Id>,
163 pub findings: Vec<Finding>,
165 pub section_refs: Vec<String>,
167 pub links: Vec<String>,
169 pub link_refs: Vec<Id>,
172}
173
174#[derive(Clone, Debug)]
175pub struct Finding {
176 pub id: FindingId,
177 pub status: String,
179}
180
181#[derive(Clone, Debug)]
182pub struct Record {
183 pub id: Option<Id>,
184 pub path: DocPath,
185 pub kind: Kind,
186 pub lifecycle: Lifecycle,
187 pub authority: Authority,
188 pub last_reviewed: Date,
189 pub aka: Vec<Id>,
191 pub edges: Edges,
192 pub facet: Facet,
193 pub body: Body,
194}
195
196impl Record {
197 pub fn minimal(
200 id: Option<Id>,
201 path: DocPath,
202 kind: Kind,
203 lifecycle: Lifecycle,
204 authority: Authority,
205 facet: Facet,
206 ) -> Self {
207 Record {
208 id,
209 path,
210 kind,
211 lifecycle,
212 authority,
213 last_reviewed: Date(String::new()),
214 aka: Vec::new(),
215 edges: Edges::default(),
216 facet,
217 body: Body::default(),
218 }
219 }
220}