1pub mod contracts;
2pub mod decisions;
3pub mod deps;
4pub mod history;
5pub mod lookup;
6pub(crate) mod matching;
7pub mod retrieve;
8pub mod staleness;
9pub mod summary;
10
11use crate::error::{ChronicleError, Result};
12use crate::git::GitOps;
13use crate::schema::common::LineRange;
14use crate::schema::v2;
15
16#[derive(Debug, Clone)]
18pub struct ReadQuery {
19 pub file: String,
20 pub anchor: Option<String>,
21 pub lines: Option<LineRange>,
22}
23
24#[derive(Debug, Clone, serde::Serialize)]
26pub struct ReadResult {
27 pub file: String,
28 pub annotations: Vec<MatchedAnnotation>,
29}
30
31#[derive(Debug, Clone, serde::Serialize)]
33pub struct MatchedAnnotation {
34 pub commit: String,
35 pub timestamp: String,
36 pub summary: String,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub motivation: Option<String>,
39 #[serde(default, skip_serializing_if = "Vec::is_empty")]
40 pub markers: Vec<v2::CodeMarker>,
41 #[serde(default, skip_serializing_if = "Vec::is_empty")]
42 pub decisions: Vec<v2::Decision>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 pub follow_up: Option<String>,
45 pub provenance: String,
46}
47
48pub fn execute(git: &dyn GitOps, query: &ReadQuery) -> Result<ReadResult> {
50 let annotations =
51 retrieve::retrieve_annotations(git, query).map_err(|e| ChronicleError::Git {
52 source: e,
53 location: snafu::Location::default(),
54 })?;
55
56 Ok(ReadResult {
57 file: query.file.clone(),
58 annotations,
59 })
60}