Skip to main content

code_moniker_workspace/snapshot/view/
sources.rs

1use 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}