tag2upload_service_manager/
t2umeta.rs1
2use crate::prelude::*;
3
4use t2umeta_abstract::Value;
5
6#[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}