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}