arch_pkg_text/desc/query/generic/
std_ext.rs

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