arch_pkg_db/single/iter/
entry.rs

1use arch_pkg_text::{
2    desc::{FieldName, ParsedField, Query, QueryMut},
3    value::Name,
4};
5use pipe_trait::Pipe;
6
7/// An entry of a querier and its name.
8///
9/// This type would implement [`Query`] and [`QueryMut`] with pre-computed name
10/// if the querier type already implemented them.
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub struct Entry<'a, Querier> {
13    name: Name<'a>,
14    querier: Querier,
15}
16
17impl<'a, Querier> Entry<'a, Querier> {
18    /// Create an entry without checking whether the names match.
19    pub(super) fn new_unchecked(name: &'a str, querier: Querier) -> Self {
20        Entry {
21            name: Name(name),
22            querier,
23        }
24    }
25
26    /// Dissolve the entry into an owned tuple name and querier.
27    pub fn into_tuple(self) -> (Name<'a>, Querier) {
28        let Entry { name, querier } = self;
29        (name, querier)
30    }
31
32    /// Get the name of the querier.
33    pub fn name(&self) -> Name<'a> {
34        self.name
35    }
36
37    /// Get an immutable reference to the querier inside.
38    pub fn querier(&self) -> &Querier {
39        &self.querier
40    }
41
42    /// Get a mutable reference to the querier inside.
43    pub fn querier_mut(&mut self) -> &mut Querier {
44        &mut self.querier
45    }
46
47    /// Get the owned querier inside.
48    pub fn into_querier(self) -> Querier {
49        self.querier
50    }
51}
52
53impl<'a, Querier> Query<'a> for Entry<'a, Querier>
54where
55    Querier: Query<'a>,
56{
57    fn query_raw_text(&self, field: ParsedField) -> Option<&'a str> {
58        match field.name() {
59            FieldName::Name => self.name().as_str().pipe(Some),
60            _ => self.querier.query_raw_text(field),
61        }
62    }
63
64    fn name(&self) -> Option<Name<'a>> {
65        self.name().pipe(Some)
66    }
67}
68
69impl<'a, Querier> QueryMut<'a> for Entry<'a, Querier>
70where
71    Querier: QueryMut<'a>,
72{
73    fn query_raw_text_mut(&mut self, field: ParsedField) -> Option<&'a str> {
74        match field.name() {
75            FieldName::Name => self.name().as_str().pipe(Some),
76            _ => self.querier.query_raw_text_mut(field),
77        }
78    }
79
80    fn name_mut(&mut self) -> Option<Name<'a>> {
81        self.name().pipe(Some)
82    }
83}