arch-pkg-text 0.10.0

Pure Rust library to parse Arch Linux packages' structured text formats
Documentation
use crate::desc::{ParsedField, Query, QueryMut, misc::ReuseAdvice};
use std::{
    rc::Rc,
    sync::{Arc, Mutex, RwLock},
};

macro_rules! impl_reuse {
    ($wrapper:ident) => {
        impl<Querier: ReuseAdvice + ?Sized> ReuseAdvice for $wrapper<Querier> {
            type ShouldReuse = Querier::ShouldReuse;
        }
    };
}

macro_rules! impl_pointer {
    ($wrapper:ident) => {
        impl<'a, Querier: Query<'a> + ?Sized> Query<'a> for $wrapper<Querier> {
            fn query_raw_text(&self, field: ParsedField) -> Option<&'a str> {
                Querier::query_raw_text(self, field)
            }
        }

        impl<'a, Querier: Query<'a> + ?Sized> QueryMut<'a> for $wrapper<Querier> {
            fn query_raw_text_mut(&mut self, field: ParsedField) -> Option<&'a str> {
                self.query_raw_text(field)
            }
        }

        impl_reuse!($wrapper);
    };
}

impl_pointer!(Box);
impl_pointer!(Rc);
impl_pointer!(Arc);

macro_rules! impl_lock {
    ($wrapper:ident, $lock:ident) => {
        impl<'a, Querier: QueryMut<'a> + ?Sized> Query<'a> for $wrapper<Querier> {
            fn query_raw_text(&self, field: ParsedField) -> Option<&'a str> {
                self.$lock()
                    .expect("lock must be acquired successfully")
                    .query_raw_text_mut(field)
            }
        }

        impl<'a, Querier: QueryMut<'a> + ?Sized> QueryMut<'a> for $wrapper<Querier> {
            fn query_raw_text_mut(&mut self, field: ParsedField) -> Option<&'a str> {
                self.query_raw_text(field)
            }
        }

        impl_reuse!($wrapper);
    };
}

impl_lock!(Mutex, lock);
impl_lock!(RwLock, write);