tag2upload_service_manager/
t2umeta.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58

use crate::prelude::*;

use t2umeta_abstract::Value;

/// Values from the tag body and message, showing it's for us
#[derive(Debug, Clone, Deftly)]
#[derive_deftly(FromSqlRow, AsBSqlRow, UpdateSqlRow)]
#[derive_deftly(UiMap, UpdateWorkerReport)]
pub struct Parsed {
    #[deftly(worker_report)]
    pub source: PackageName,
    #[deftly(worker_report)]
    pub version: VersionString,
}

#[derive(Default, Deftly)]
#[derive_deftly(FromTagMessage)]
pub struct Scanned {
    pub please_upload: Option<()>,
    pub distro: HashSet<String>,
    pub source: Option<PackageName>,
    pub version: Option<VersionString>,
}

impl Value for PackageName {}
impl Value for VersionString {}

impl Scanned {
    pub fn parse(self, config: &Config) -> Result<Parsed, NotForUsReason> {
        let Scanned {
            please_upload,
            distro,
            source,
            version,
        } = self;

        let () = please_upload.ok_or_else(|| NFR::NoPleaseUpload)?;
        
        distro.contains(&config.t2u.distro).then_some(())
            .ok_or_else(|| NFR::MetaNotOurDistro)?;

        let source = source.ok_or_else(|| NFR::MissingSource)?;
        let version = version.ok_or_else(|| NFR::MissingVersion)?;

        Ok(Parsed {
            source,
            version,
        })
    }
}

impl Parsed {
    pub fn from_tag_message(s: &str) -> Result<Parsed, NotForUsReason> {
        Scanned::from_tag_message(s)?
            .parse(&globals().config)
    }
}