scrapyard_core/
package.rs

1use regex::Regex;
2
3#[derive(Serialize, Deserialize, Debug, PartialEq)]
4pub enum Package {
5    LQFP(u16),
6    TSSOP(u16),
7    WLCSP(u16),
8    UFQFPN(u16),
9    TFBGA(u16),
10    VFQFPN(u16),
11    EWLCSP(u16),
12    UFBGA(u16),
13    LFBGA(u16),
14    Unknown(u16),
15}
16
17impl Package {
18    // TODO: Return error
19    pub fn new(package: &str) -> Package {
20        lazy_static! {
21            static ref RE :Regex = Regex::new(r"([[:alpha:]]*)(\d*)").unwrap();
22        }
23
24        let caps = RE.captures(package).unwrap();
25
26        let count = caps.get(2).unwrap().as_str().parse::<u16>().unwrap();
27
28        match caps.get(1).unwrap().as_str() {
29            "LQFP" => Package::LQFP(count),
30            "TSSOP" => Package::TSSOP(count),
31            "WLCSP" => Package::WLCSP(count),
32            "UFQFPN" => Package::UFQFPN(count),
33            "TFBGA" => Package::TFBGA(count),
34            "VFQFPN" => Package::VFQFPN(count),
35            "EWLCSP" => Package::EWLCSP(count),
36            "UFBGA" => Package::UFBGA(count),
37            "LFBGA" => Package::LFBGA(count),
38            &_ => Package::Unknown(count),
39        }
40    }
41
42    pub fn is_grid(&self) -> bool {
43        match *self {
44            Package::UFBGA(_) => true,
45            Package::TFBGA(_) => true,
46            Package::EWLCSP(_) => true,
47            Package::WLCSP(_) => true,
48            Package::LFBGA(_) => true,
49            _ => false,
50        }
51    }
52
53    pub fn pins(&self) -> u16 {
54        match *self {
55            Package::LQFP(count) => count,
56            Package::TSSOP(count) => count,
57            Package::WLCSP(count) => count,
58            Package::UFQFPN(count) => count,
59            Package::TFBGA(count) => count,
60            Package::VFQFPN(count) => count,
61            Package::EWLCSP(count) => count,
62            Package::UFBGA(count) => count,
63            Package::LFBGA(count) => count,
64            Package::Unknown(count) => count,
65        }
66    }
67}
68
69#[cfg(test)]
70mod tests {
71
72    use super::*;
73
74    #[test]
75    fn package_lqfp48() {
76        let package_name = "LQFP48";
77
78        let package = Package::new(package_name);
79
80        assert_eq!(false, package.is_grid());
81        assert_eq!(48, package.pins());
82    }
83
84    #[test]
85    fn package_tfbga() {
86        let package_name = "TFBGA144";
87
88        let package = Package::new(package_name);
89
90        assert_eq!(true, package.is_grid());
91        assert_eq!(144, package.pins());
92    }
93
94    #[test]
95    #[should_panic]
96    fn package_fail() {
97        let package_name = "";
98
99        let package = Package::new(package_name);
100    }
101}