1use std::str::FromStr;
4
5use alpm_parsers::prelude::*;
6#[cfg(feature = "serde")]
7use serde::{Deserialize, Serialize};
8use strum::{AsRefStr, Display, EnumString, IntoStaticStr, VariantNames};
9use winnow::{ascii::alpha1, error::ErrMode};
10
11#[derive(
18 AsRefStr, Clone, Copy, Debug, Display, EnumString, Eq, IntoStaticStr, PartialEq, VariantNames,
19)]
20#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
21pub enum FileTypeIdentifier {
22 #[cfg_attr(feature = "serde", serde(rename = "pkg"))]
26 #[strum(to_string = "pkg")]
27 BinaryPackage,
28
29 #[cfg_attr(feature = "serde", serde(rename = "db"))]
31 #[strum(to_string = "db")]
32 RepositorySyncDatabase,
33
34 #[cfg_attr(feature = "serde", serde(rename = "src"))]
36 #[strum(to_string = "src")]
37 SourcePackage,
38}
39
40impl AlpmParser for FileTypeIdentifier {
41 fn parser<'a>(input: &mut Input<'a>) -> PResult<'a, Self> {
48 alpha1
49 .try_map(FileTypeIdentifier::from_str)
50 .expected_strings(FileTypeIdentifier::VARIANTS)
51 .layer("file type identifier")
52 .parse_next(input)
53 }
54
55 fn delimiter_error_context<'a, O, P>(
56 parser: P,
57 ) -> impl Parser<Input<'a>, O, ErrMode<ParseStack<'a>>>
58 where
59 P: Parser<Input<'a>, O, ErrMode<ParseStack<'a>>>,
60 {
61 parser
62 .expected_text("a string consisting of alphabetic characters")
63 .layer("file type identifier")
64 }
65}