scrapyard_core/
package.rs1use 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 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}