tag2upload_service_manager/
t2umeta.rs

1
2use crate::prelude::*;
3
4use t2umeta_abstract::Value;
5
6/// Values from the tag body and message, showing it's for us
7#[derive(Debug, Clone, Deftly)]
8#[derive_deftly(FromSqlRow, AsBSqlRow, UpdateSqlRow)]
9#[derive_deftly(UiMap, UpdateWorkerReport)]
10pub struct Parsed {
11    #[deftly(worker_report)]
12    pub source: PackageName,
13    #[deftly(worker_report)]
14    pub version: VersionString,
15}
16
17#[derive(Default, Deftly)]
18#[derive_deftly(FromTagMessage)]
19pub struct Scanned {
20    pub please_upload: Option<()>,
21    pub distro: HashSet<String>,
22    pub source: Option<PackageName>,
23    pub version: Option<VersionString>,
24}
25
26impl Value for PackageName {}
27impl Value for VersionString {}
28
29pub struct PasslistedPackagePattern(pub glob::Pattern);
30
31impl Scanned {
32    pub fn parse(self, config: &Config) -> Result<Parsed, NotForUsReason> {
33        let Scanned {
34            please_upload,
35            distro,
36            source,
37            version,
38        } = self;
39
40        let () = please_upload.ok_or_else(|| NFR::NoPleaseUpload)?;
41        
42        distro.contains(&config.t2u.distro).then_some(())
43            .ok_or_else(|| NFR::MetaNotOurDistro)?;
44
45        let source = source.ok_or_else(|| NFR::MissingSource)?;
46        let version = version.ok_or_else(|| NFR::MissingVersion)?;
47
48        if let Some(passlist) = &config.testing.allowed_source_packages {
49            if ! passlist.iter().any(|pat| pat.matches(&source)) {
50                return Err(NFR::PackageNotPasslisted);
51            }
52        }
53
54        Ok(Parsed {
55            source,
56            version,
57        })
58    }
59}
60
61impl Parsed {
62    pub fn from_tag_message(s: &str) -> Result<Parsed, NotForUsReason> {
63        Scanned::from_tag_message(s)?
64            .parse(&globals().config)
65    }
66}