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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use std::path::{Path, PathBuf};

pub mod apk;
pub mod appimage;

pub struct Package {
    name: String,
    bin: Vec<Item>,
    lib: Vec<Item>,
    asset: Vec<Item>,
}

pub struct Item {
    path: PathBuf,
    name: String,
}

impl Item {
    pub fn new(path: PathBuf, name: String) -> Self {
        Self { path, name }
    }

    pub fn path(&self) -> &Path {
        &self.path
    }

    pub fn name(&self) -> &str {
        &self.name
    }
}

impl From<PathBuf> for Item {
    fn from(path: PathBuf) -> Self {
        let name = path.file_name().unwrap().to_str().unwrap().to_string();
        Self { path, name }
    }
}

impl Package {
    pub fn new(name: &str) -> Self {
        Self {
            name: name.to_string(),
            bin: Default::default(),
            lib: Default::default(),
            asset: Default::default(),
        }
    }

    pub fn name(&self) -> &str {
        &self.name
    }

    pub fn bins(&self) -> &[Item] {
        &self.bin
    }

    pub fn libs(&self) -> &[Item] {
        &self.lib
    }

    pub fn assets(&self) -> &[Item] {
        &self.asset
    }

    pub fn add_bin<T: Into<Item>>(&mut self, item: T) {
        self.bin.push(item.into());
    }

    pub fn add_lib<T: Into<Item>>(&mut self, item: T) {
        self.lib.push(item.into());
    }

    pub fn add_asset<T: Into<Item>>(&mut self, item: T) {
        self.asset.push(item.into());
    }
}