arch_pkg_text/desc/query/generic/
std_ext.rs

1use crate::desc::{ParsedField, Query, QueryMut};
2use std::{
3    rc::Rc,
4    sync::{Arc, Mutex, RwLock},
5};
6
7macro_rules! impl_pointer {
8    ($wrapper:ident) => {
9        impl<'a, Querier: Query<'a> + ?Sized> Query<'a> for $wrapper<Querier> {
10            fn query_raw_text(&self, field: ParsedField) -> Option<&'a str> {
11                Querier::query_raw_text(self, field)
12            }
13        }
14
15        impl<'a, Querier: Query<'a> + ?Sized> QueryMut<'a> for $wrapper<Querier> {
16            fn query_raw_text_mut(&mut self, field: ParsedField) -> Option<&'a str> {
17                self.query_raw_text(field)
18            }
19        }
20    };
21}
22
23impl_pointer!(Box);
24impl_pointer!(Rc);
25impl_pointer!(Arc);
26
27macro_rules! impl_lock {
28    ($wrapper:ident, $lock:ident) => {
29        impl<'a, Querier: QueryMut<'a> + ?Sized> Query<'a> for $wrapper<Querier> {
30            fn query_raw_text(&self, field: ParsedField) -> Option<&'a str> {
31                self.$lock()
32                    .expect("lock must be acquired successfully")
33                    .query_raw_text_mut(field)
34            }
35        }
36
37        impl<'a, Querier: QueryMut<'a> + ?Sized> QueryMut<'a> for $wrapper<Querier> {
38            fn query_raw_text_mut(&mut self, field: ParsedField) -> Option<&'a str> {
39                self.query_raw_text(field)
40            }
41        }
42    };
43}
44
45impl_lock!(Mutex, lock);
46impl_lock!(RwLock, write);