hyper_scripter/query/
list_query_handler.rs

1use super::{do_script_query_strict, ListQuery, ScriptQuery};
2use crate::error::{Error, Result};
3use crate::script::ScriptName;
4use crate::script_repo::{RepoEntry, ScriptRepo, Visibility};
5
6pub trait ListQueryHandler {
7    type Item;
8    async fn handle_query<'a, T: StableRepo>(
9        &mut self,
10        query: ScriptQuery,
11        repo: &'a mut T,
12    ) -> Result<Option<RepoEntry<'a>>>;
13    fn handle_item(&mut self, item: Self::Item) -> Option<ListQuery>;
14    fn should_raise_dont_fuzz_on_empty() -> bool;
15    fn should_return_all_on_empty() -> bool;
16}
17
18pub struct DefaultListQueryHandler;
19
20impl ListQueryHandler for DefaultListQueryHandler {
21    type Item = ListQuery;
22    async fn handle_query<'a, T: StableRepo>(
23        &mut self,
24        query: ScriptQuery,
25        repo: &'a mut T,
26    ) -> Result<Option<RepoEntry<'a>>> {
27        match do_script_query_strict(&query, repo).await {
28            Ok(script) => Ok(Some(script)),
29            Err(Error::DontFuzz) => Ok(None),
30            Err(err) => Err(err),
31        }
32    }
33    fn handle_item(&mut self, item: Self::Item) -> Option<ListQuery> {
34        Some(item)
35    }
36    fn should_raise_dont_fuzz_on_empty() -> bool {
37        true
38    }
39    fn should_return_all_on_empty() -> bool {
40        true
41    }
42}
43
44/// A repo without insert & delete
45pub trait StableRepo {
46    fn iter_mut(&mut self, visibility: Visibility) -> impl Iterator<Item = RepoEntry<'_>>;
47    fn latest_mut(&mut self, n: usize, visibility: Visibility) -> Option<RepoEntry<'_>>;
48    fn get_mut(&mut self, name: &ScriptName, visibility: Visibility) -> Option<RepoEntry<'_>>;
49}
50
51impl StableRepo for ScriptRepo {
52    fn iter_mut(&mut self, visibility: Visibility) -> impl Iterator<Item = RepoEntry<'_>> {
53        self.iter_mut(visibility)
54    }
55    fn latest_mut(&mut self, n: usize, visibility: Visibility) -> Option<RepoEntry<'_>> {
56        self.latest_mut(n, visibility)
57    }
58    fn get_mut(&mut self, name: &ScriptName, visibility: Visibility) -> Option<RepoEntry<'_>> {
59        self.get_mut(name, visibility)
60    }
61}