Skip to main content

alpm_types/package/
validation.rs

1//! Package validation handling.
2
3use std::str::FromStr;
4
5use alpm_parsers::prelude::*;
6#[cfg(feature = "serde")]
7use serde::{Deserialize, Serialize};
8use strum::{AsRefStr, Display, EnumString, VariantNames};
9use winnow::{ascii::alphanumeric1, error::ErrMode};
10
11/// The validation method used during installation of a package.
12///
13/// A validation method can ensure the integrity of a package.
14/// Certain methods (i.e. [`PackageValidation::Pgp`]) can also be used to ensure a package's
15/// authenticity.
16///
17/// # Examples
18///
19/// Parsing from strings:
20///
21/// ```
22/// use std::str::FromStr;
23///
24/// use alpm_types::PackageValidation;
25///
26/// # fn main() -> Result<(), alpm_types::Error> {
27/// assert_eq!(
28///     PackageValidation::from_str("none")?,
29///     PackageValidation::None
30/// );
31/// assert_eq!(PackageValidation::from_str("md5")?, PackageValidation::Md5);
32/// assert_eq!(
33///     PackageValidation::from_str("sha256")?,
34///     PackageValidation::Sha256
35/// );
36/// assert_eq!(PackageValidation::from_str("pgp")?, PackageValidation::Pgp);
37///
38/// // Invalid values return an error.
39/// assert!(PackageValidation::from_str("crc32").is_err());
40/// # Ok(())
41/// # }
42/// ```
43///
44/// Displaying and serializing:
45///
46/// ```
47/// use alpm_types::PackageValidation;
48///
49/// # fn main() -> Result<(), alpm_types::Error> {
50/// assert_eq!(PackageValidation::Md5.to_string(), "md5");
51/// # #[cfg(feature = "serde")]
52/// # {
53/// assert_eq!(
54///     serde_json::to_string(&PackageValidation::Sha256).expect("Serialization failed"),
55///     "\"Sha256\""
56/// );
57/// # }
58/// # Ok(())
59/// # }
60/// ```
61#[derive(AsRefStr, Clone, Debug, Display, EnumString, PartialEq, VariantNames)]
62#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
63#[strum(serialize_all = "lowercase")]
64pub enum PackageValidation {
65    /// The package integrity and authenticity is **not validated**.
66    None,
67    /// The package is validated against an accompanying **MD5 hash digest**.
68    Md5,
69    /// The package is validated against an accompanying **SHA-256 hash digest**.
70    Sha256,
71    /// The package is validated using **PGP signatures**.
72    Pgp,
73}
74
75impl AlpmParser for PackageValidation {
76    /// Recognizes a [`PackageValidation`] in a string slice.
77    ///
78    /// # Errors
79    ///
80    /// Returns an error if `input` does not begin with a valid variant
81    /// of [`PackageValidation`].
82    fn parser<'a>(input: &mut Input<'a>) -> PResult<'a, Self> {
83        alphanumeric1
84            .try_map(PackageValidation::from_str)
85            .expected_strings(PackageValidation::VARIANTS)
86            .layer("package validation method")
87            .parse_next(input)
88    }
89
90    fn delimiter_error_context<'a, O, P>(
91        parser: P,
92    ) -> impl Parser<Input<'a>, O, ErrMode<ParseStack<'a>>>
93    where
94        P: Parser<Input<'a>, O, ErrMode<ParseStack<'a>>>,
95    {
96        parser
97            .expected_text("a string consisting of alphanumeric characters")
98            .expected_strings(PackageValidation::VARIANTS)
99            .layer("package validation method")
100    }
101}