Skip to main content

chronicle/read/
mod.rs

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/// Query parameters for reading annotations.
17#[derive(Debug, Clone)]
18pub struct ReadQuery {
19    pub file: String,
20    pub anchor: Option<String>,
21    pub lines: Option<LineRange>,
22}
23
24/// Result of a read query.
25#[derive(Debug, Clone, serde::Serialize)]
26pub struct ReadResult {
27    pub file: String,
28    pub annotations: Vec<MatchedAnnotation>,
29}
30
31/// A v2-native annotation matched to a specific commit.
32#[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
48/// Execute a read query against the repository.
49pub 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}