arch-pkg-text 0.10.0

Pure Rust library to parse Arch Linux packages' structured text formats
Documentation
use crate::{
    desc::field::{FieldName, ParsedField},
    value,
};

macro_rules! def_traits {
    ($(
        $(#[$attrs:meta])*
        $name:ident, $name_mut:ident = $field_name:ident -> $value_type:ident;
    )*) => {
        /// Get information from a `desc` file.
        ///
        /// Every querier follows the rules below:
        /// * A field that is absent from the text yields `None`.
        /// * A field whose value is empty also yields `None`.
        /// * Should a field occur more than once, only its first occurrence counts.
        pub trait Query<'a> {
            fn query_raw_text(&self, field: ParsedField) -> Option<&'a str>;
            $(
                $(#[$attrs])*
                fn $name(&self) -> Option<value::$value_type<'a>> {
                    self.query_raw_text(ParsedField::new(FieldName::$field_name))
                        .map(value::$value_type::new)
                }
            )*
        }

        /// Get information from a `desc` file, mutability required.
        ///
        /// Every querier follows the rules below:
        /// * A field that is absent from the text yields `None`.
        /// * A field whose value is empty also yields `None`.
        /// * Should a field occur more than once, only its first occurrence counts.
        pub trait QueryMut<'a> {
            fn query_raw_text_mut(&mut self, field: ParsedField) -> Option<&'a str>;
            $(
                $(#[$attrs])*
                fn $name_mut(&mut self) -> Option<value::$value_type<'a>> {
                    self.query_raw_text_mut(ParsedField::new(FieldName::$field_name))
                        .map(value::$value_type::new)
                }
            )*
        }
    };
}

def_traits! {
    file_name, file_name_mut = FileName -> FileName;
    name, name_mut = Name -> Name;
    base, base_mut = Base -> Base;
    version, version_mut = Version -> Version;
    description, description_mut = Description -> Description;
    groups, groups_mut = Groups -> GroupList;
    compressed_size, compressed_size_mut = CompressedSize -> Size;
    installed_size, installed_size_mut = InstalledSize -> Size;
    md5_checksum, md5_checksum_mut = Md5Checksum -> Hex128;
    sha256_checksum, sha256_checksum_mut = Sha256Checksum -> Hex256;
    pgp_signature, pgp_signature_mut = PgpSignature -> PgpSignature;
    url, url_mut = Url -> Url;
    license, license_mut = License -> LicenseList;
    architecture, architecture_mut = Architecture -> ArchitectureList;
    build_date, build_date_mut = BuildDate -> Timestamp;
    packager, packager_mut = Packager -> Packager;
    dependencies, dependencies_mut = Dependencies -> DependencyList;
    make_dependencies, make_dependencies_mut = MakeDependencies -> DependencyList;
    check_dependencies, check_dependencies_mut = CheckDependencies -> DependencyList;
    opt_dependencies, opt_dependencies_mut = OptionalDependencies -> DependencyAndReasonList;
    provides, provides_mut = Provides -> DependencyList;
    conflicts, conflicts_mut = Conflicts -> DependencyList;
    replaces, replaces_mut = Replaces -> DependencyList;
}

mod forgetful;
mod generic;
mod memo;

pub use crate::parse::ParsedDesc as EagerQuerier;
pub use forgetful::ForgetfulQuerier;
pub use memo::MemoQuerier;