code_moniker_workspace/snapshot/view/
sources.rs1use super::model::SourceSummary;
2use crate::snapshot::model::{SourceId, WorkspaceSnapshot};
3
4pub struct SourceView<'a> {
5 snapshot: &'a WorkspaceSnapshot,
6}
7
8impl<'a> SourceView<'a> {
9 pub(super) fn new(snapshot: &'a WorkspaceSnapshot) -> Self {
10 Self { snapshot }
11 }
12
13 pub fn all(&self) -> Vec<SourceSummary> {
14 self.snapshot
15 .catalog
16 .sources
17 .iter()
18 .map(|source| SourceSummary {
19 id: source.id,
20 display_name: source.display_name.clone(),
21 language: source.language.clone(),
22 change_count: self.change_count_for_source(&source.id),
23 })
24 .collect()
25 }
26
27 pub fn record(&self, id: &SourceId) -> Option<&'a crate::snapshot::model::SourceFileRecord> {
28 let record = self.snapshot.index.sources.get(id.file());
29 if let Some(record) = record
30 && &record.id == id
31 {
32 return Some(record);
33 }
34 self.snapshot
35 .index
36 .sources
37 .iter()
38 .find(|source| &source.id == id)
39 }
40
41 pub fn find(&self, source: &SourceId) -> Option<SourceSummary> {
42 self.all()
43 .into_iter()
44 .find(|candidate| &candidate.id == source)
45 }
46
47 fn change_count_for_source(&self, source: &SourceId) -> usize {
48 self.snapshot
49 .changes
50 .changes
51 .iter()
52 .filter(|change| change.source.as_ref() == Some(source))
53 .count()
54 }
55}