Skip to main content

kimun_notes/components/note_browser/
link_results_provider.rs

1use async_trait::async_trait;
2use kimun_core::nfs::NoteEntryData;
3use kimun_core::note::NoteContentData;
4
5use super::NoteBrowserProvider;
6use crate::components::file_list::FileListEntry;
7
8/// A provider pre-populated with a fixed list of notes, used when following a
9/// link that resolves to several candidates.  The query is ignored.
10pub struct LinkResultsProvider {
11    entries: Vec<FileListEntry>,
12}
13
14impl LinkResultsProvider {
15    pub fn from_results(results: Vec<(NoteEntryData, NoteContentData)>) -> Self {
16        let entries = results
17            .into_iter()
18            .map(|(entry, content)| {
19                let filename = entry.path.get_parent_path().1;
20                let title = if content.title.trim().is_empty() {
21                    "<no title>".to_string()
22                } else {
23                    content.title
24                };
25                FileListEntry::Note {
26                    path: entry.path,
27                    title,
28                    filename,
29                    journal_date: None,
30                }
31            })
32            .collect();
33        Self { entries }
34    }
35}
36
37#[async_trait]
38impl NoteBrowserProvider for LinkResultsProvider {
39    async fn load(&self, query: &str) -> Vec<FileListEntry> {
40        if query.is_empty() {
41            return self.entries.clone();
42        }
43        let q = query.to_lowercase();
44        self.entries
45            .iter()
46            .filter(|e| match e {
47                FileListEntry::Note {
48                    title,
49                    filename,
50                    path,
51                    ..
52                } => {
53                    title.to_lowercase().contains(&q)
54                        || filename.to_lowercase().contains(&q)
55                        || path.to_string().to_lowercase().contains(&q)
56                }
57                _ => false,
58            })
59            .cloned()
60            .collect()
61    }
62}