Skip to main content

arch_pkg_text/desc/
query.rs

1use crate::{
2    desc::field::{FieldName, ParsedField},
3    value,
4};
5
6macro_rules! def_traits {
7    ($(
8        $(#[$attrs:meta])*
9        $name:ident, $name_mut:ident = $field_name:ident -> $value_type:ident;
10    )*) => {
11        /// Get information from a `desc` file.
12        ///
13        /// Every querier follows the rules below:
14        /// * A field that is absent from the text yields `None`.
15        /// * A field whose value is empty also yields `None`.
16        /// * Should a field occur more than once, only its first occurrence counts.
17        pub trait Query<'a> {
18            fn query_raw_text(&self, field: ParsedField) -> Option<&'a str>;
19            $(
20                $(#[$attrs])*
21                fn $name(&self) -> Option<value::$value_type<'a>> {
22                    self.query_raw_text(ParsedField::new(FieldName::$field_name))
23                        .map(value::$value_type::new)
24                }
25            )*
26        }
27
28        /// Get information from a `desc` file, mutability required.
29        ///
30        /// Every querier follows the rules below:
31        /// * A field that is absent from the text yields `None`.
32        /// * A field whose value is empty also yields `None`.
33        /// * Should a field occur more than once, only its first occurrence counts.
34        pub trait QueryMut<'a> {
35            fn query_raw_text_mut(&mut self, field: ParsedField) -> Option<&'a str>;
36            $(
37                $(#[$attrs])*
38                fn $name_mut(&mut self) -> Option<value::$value_type<'a>> {
39                    self.query_raw_text_mut(ParsedField::new(FieldName::$field_name))
40                        .map(value::$value_type::new)
41                }
42            )*
43        }
44    };
45}
46
47def_traits! {
48    file_name, file_name_mut = FileName -> FileName;
49    name, name_mut = Name -> Name;
50    base, base_mut = Base -> Base;
51    version, version_mut = Version -> Version;
52    description, description_mut = Description -> Description;
53    groups, groups_mut = Groups -> GroupList;
54    compressed_size, compressed_size_mut = CompressedSize -> Size;
55    installed_size, installed_size_mut = InstalledSize -> Size;
56    md5_checksum, md5_checksum_mut = Md5Checksum -> Hex128;
57    sha256_checksum, sha256_checksum_mut = Sha256Checksum -> Hex256;
58    pgp_signature, pgp_signature_mut = PgpSignature -> PgpSignature;
59    url, url_mut = Url -> Url;
60    license, license_mut = License -> LicenseList;
61    architecture, architecture_mut = Architecture -> ArchitectureList;
62    build_date, build_date_mut = BuildDate -> Timestamp;
63    packager, packager_mut = Packager -> Packager;
64    dependencies, dependencies_mut = Dependencies -> DependencyList;
65    make_dependencies, make_dependencies_mut = MakeDependencies -> DependencyList;
66    check_dependencies, check_dependencies_mut = CheckDependencies -> DependencyList;
67    opt_dependencies, opt_dependencies_mut = OptionalDependencies -> DependencyAndReasonList;
68    provides, provides_mut = Provides -> DependencyList;
69    conflicts, conflicts_mut = Conflicts -> DependencyList;
70    replaces, replaces_mut = Replaces -> DependencyList;
71}
72
73mod forgetful;
74mod generic;
75mod memo;
76
77pub use crate::parse::ParsedDesc as EagerQuerier;
78pub use forgetful::ForgetfulQuerier;
79pub use memo::MemoQuerier;