1use std::io::BufRead;
9
10use serde::{Deserialize, Deserializer};
11
12use crate::{
13 architectures::Architecture, package::PackageName, utils::WhitespaceListVisitor,
14 version::PackageVersion,
15};
16
17fn deserialize_architecture<'de, D>(deserializer: D) -> Result<Vec<Architecture>, D::Error>
18where
19 D: Deserializer<'de>,
20{
21 deserializer.deserialize_str(WhitespaceListVisitor::<Architecture>::new())
22}
23
24#[derive(Debug, PartialEq, Eq, Deserialize, Hash)]
26#[serde(rename_all = "PascalCase")]
27pub struct Buildinfo {
28 pub source: PackageName,
30 pub version: PackageVersion,
32 #[serde(deserialize_with = "deserialize_architecture")]
34 pub architecture: Vec<Architecture>,
35}
36
37pub fn from_reader(reader: impl BufRead) -> Result<Buildinfo, rfc822_like::de::Error> {
39 rfc822_like::from_reader(reader)
40}
41
42pub fn from_str(data: &str) -> Result<Buildinfo, rfc822_like::de::Error> {
44 rfc822_like::from_str(data)
45}
46
47#[cfg(test)]
48mod test {
49 use crate::{architectures::Architecture, buildinfo::Buildinfo, version::PackageVersion};
50
51 #[test]
52 fn deserialize() {
53 let data = r#"Format: 1.0
54Source: picnic
55Binary: libpicnic-dev libpicnic3 libpicnic3-dbgsym
56Architecture: i386 source
57Version: 3.0.11-1
58Checksums-Md5:
59 4b7826495233d2d3147ccaabead13a36 951 picnic_3.0.11-1.dsc
60 1610e5affd53cf17b64b5727a32a6db9 10180 libpicnic-dev_3.0.11-1_i386.deb
61 8229544cbadbe421e713fc247429b744 727956 libpicnic3-dbgsym_3.0.11-1_i386.deb
62 924c58e34c3ff074850201984493a44d 619732 libpicnic3_3.0.11-1_i386.deb
63Checksums-Sha1:
64 e6cd8381339635aea7f4850105dbbdb5ac33e248 951 picnic_3.0.11-1.dsc
65 d916aa5940e7c88fbe0fa420234c0a78db569c43 10180 libpicnic-dev_3.0.11-1_i386.deb
66 383843942719b1a5fa8cdf2d768a4b1566c80f4d 727956 libpicnic3-dbgsym_3.0.11-1_i386.deb
67 5fabd52dfee1258d2e9ac43f5d8c2f7ba61ca8cb 619732 libpicnic3_3.0.11-1_i386.deb
68Checksums-Sha256:
69 8b2a1969501be49fe11e8e8005bf9a3aac0e073d4c7fd97dcb8bfb6f8c9a222a 951 picnic_3.0.11-1.dsc
70 96ab1c37ca12b0fb28169b79cf4a850ede58ab269abcc36eb6e36a6e66906b47 10180 libpicnic-dev_3.0.11-1_i386.deb
71 d114fe20288c31fd2ac7644e1059fcc145788abff11325e84b0ad982ca486ed6 727956 libpicnic3-dbgsym_3.0.11-1_i386.deb
72 012f9a5a27dabfc72c4d7010406e9635a747b9c4c42bc9554aaecc4c9edd0fee 619732 libpicnic3_3.0.11-1_i386.deb
73Build-Origin: Debian
74Build-Architecture: i386
75Build-Date: Tue, 25 Jan 2022 21:54:55 +0000
76Build-Path: /build/picnic-SQCH61/picnic-3.0.11
77Installed-Build-Depends:
78 autoconf (= 2.71-2),
79 automake (= 1:1.16.5-1.1),
80 autopoint (= 0.21-4),
81 autotools-dev (= 20180224.1+nmu1),
82 base-files (= 12.2),
83 base-passwd (= 3.5.52),
84 bash (= 5.1-6),
85 binutils (= 2.37.90.20220123-1),
86 binutils-common (= 2.37.90.20220123-1),
87 binutils-i686-linux-gnu (= 2.37.90.20220123-1),
88 bsdextrautils (= 2.37.3-1),
89 bsdutils (= 1:2.37.3-1),
90 build-essential (= 12.9),
91 bzip2 (= 1.0.8-5),
92 cmake (= 3.22.1-1+b1),
93 cmake-data (= 3.22.1-1),
94 coreutils (= 8.32-4.1),
95 cpp (= 4:11.2.0-2),
96 cpp-11 (= 11.2.0-14),
97 dash (= 0.5.11+git20210903+057cd650a4ed-3),
98 debconf (= 1.5.79),
99 debhelper (= 13.6),
100 debianutils (= 5.7-0.1),
101 dh-autoreconf (= 20),
102 dh-elpa-helper (= 2.0.10),
103 dh-strip-nondeterminism (= 1.13.0-1),
104 diffutils (= 1:3.7-5),
105 dpkg (= 1.21.1),
106 dpkg-dev (= 1.21.1),
107 dwz (= 0.14-1),
108 emacsen-common (= 3.0.4),
109 file (= 1:5.41-2),
110 findutils (= 4.8.0-1),
111 g++ (= 4:11.2.0-2),
112 g++-11 (= 11.2.0-14),
113 gcc (= 4:11.2.0-2),
114 gcc-11 (= 11.2.0-14),
115 gcc-11-base (= 11.2.0-14),
116 gettext (= 0.21-4),
117 gettext-base (= 0.21-4),
118 grep (= 3.7-1),
119 groff-base (= 1.22.4-8),
120 gzip (= 1.10-4),
121 hostname (= 3.23),
122 init-system-helpers (= 1.61),
123 intltool-debian (= 0.35.0+20060710.5),
124 libacl1 (= 2.3.1-1),
125 libarchive-zip-perl (= 1.68-1),
126 libarchive13 (= 3.5.2-1),
127 libasan6 (= 11.2.0-14),
128 libatomic1 (= 11.2.0-14),
129 libattr1 (= 1:2.5.1-1),
130 libaudit-common (= 1:3.0.6-1),
131 libaudit1 (= 1:3.0.6-1+b1),
132 libbinutils (= 2.37.90.20220123-1),
133 libblkid1 (= 2.37.3-1),
134 libboost-test-dev (= 1.74.0.3),
135 libboost-test1.74-dev (= 1.74.0-14),
136 libboost-test1.74.0 (= 1.74.0-14),
137 libboost1.74-dev (= 1.74.0-14),
138 libbrotli1 (= 1.0.9-2+b3),
139 libbz2-1.0 (= 1.0.8-5),
140 libc-bin (= 2.33-4),
141 libc-dev-bin (= 2.33-4),
142 libc6 (= 2.33-4),
143 libc6-dev (= 2.33-4),
144 libcap-ng0 (= 0.7.9-2.2+b1),
145 libcap2 (= 1:2.44-1),
146 libcc1-0 (= 11.2.0-14),
147 libcom-err2 (= 1.46.5-2),
148 libcrypt-dev (= 1:4.4.27-1.1),
149 libcrypt1 (= 1:4.4.27-1.1),
150 libctf-nobfd0 (= 2.37.90.20220123-1),
151 libctf0 (= 2.37.90.20220123-1),
152 libcurl4 (= 7.81.0-1),
153 libdb5.3 (= 5.3.28+dfsg1-0.8),
154 libdebconfclient0 (= 0.261),
155 libdebhelper-perl (= 13.6),
156 libdpkg-perl (= 1.21.1),
157 libelf1 (= 0.186-1),
158 libexpat1 (= 2.4.3-2),
159 libffi8 (= 3.4.2-4),
160 libfile-stripnondeterminism-perl (= 1.13.0-1),
161 libgcc-11-dev (= 11.2.0-14),
162 libgcc-s1 (= 11.2.0-14),
163 libgcrypt20 (= 1.9.4-5),
164 libgdbm-compat4 (= 1.22-1),
165 libgdbm6 (= 1.22-1),
166 libglib2.0-0 (= 2.70.2-1),
167 libgmp10 (= 2:6.2.1+dfsg-3),
168 libgnutls30 (= 3.7.3-4),
169 libgomp1 (= 11.2.0-14),
170 libgpg-error0 (= 1.43-3),
171 libgssapi-krb5-2 (= 1.18.3-7),
172 libhogweed6 (= 3.7.3-1),
173 libicu67 (= 67.1-7),
174 libidn2-0 (= 2.3.2-2),
175 libisl23 (= 0.24-2),
176 libitm1 (= 11.2.0-14),
177 libjsoncpp25 (= 1.9.5-2),
178 libk5crypto3 (= 1.18.3-7),
179 libkeyutils1 (= 1.6.1-2),
180 libkrb5-3 (= 1.18.3-7),
181 libkrb5support0 (= 1.18.3-7),
182 libldap-2.4-2 (= 2.4.59+dfsg-1),
183 liblz4-1 (= 1.9.3-2),
184 liblzma5 (= 5.2.5-2),
185 libm4ri-0.0.20200125 (= 20200125-1+b1),
186 libm4ri-dev (= 20200125-1+b1),
187 libmagic-mgc (= 1:5.41-2),
188 libmagic1 (= 1:5.41-2),
189 libmount1 (= 2.37.3-1),
190 libmpc3 (= 1.2.1-1),
191 libmpfr6 (= 4.1.0-3),
192 libncurses6 (= 6.3-2),
193 libncursesw6 (= 6.3-2),
194 libnettle8 (= 3.7.3-1),
195 libnghttp2-14 (= 1.43.0-1),
196 libnsl-dev (= 1.3.0-2),
197 libnsl2 (= 1.3.0-2),
198 libp11-kit0 (= 0.24.0-6),
199 libpam-modules (= 1.4.0-11),
200 libpam-modules-bin (= 1.4.0-11),
201 libpam-runtime (= 1.4.0-11),
202 libpam0g (= 1.4.0-11),
203 libpcre2-8-0 (= 10.39-3),
204 libpcre3 (= 2:8.39-13),
205 libperl5.32 (= 5.32.1-6),
206 libpipeline1 (= 1.5.5-1),
207 libpng16-16 (= 1.6.37-3),
208 libprocps8 (= 2:3.3.17-6),
209 libpsl5 (= 0.21.0-1.2),
210 libquadmath0 (= 11.2.0-14),
211 librhash0 (= 1.4.2-1),
212 librtmp1 (= 2.4+20151223.gitfa8646d.1-2+b2),
213 libsasl2-2 (= 2.1.27+dfsg2-3),
214 libsasl2-modules-db (= 2.1.27+dfsg2-3),
215 libseccomp2 (= 2.5.3-2),
216 libselinux1 (= 3.3-1+b1),
217 libsigsegv2 (= 2.13-1),
218 libsmartcols1 (= 2.37.3-1),
219 libssh2-1 (= 1.10.0-2),
220 libssl1.1 (= 1.1.1m-1),
221 libstdc++-11-dev (= 11.2.0-14),
222 libstdc++6 (= 11.2.0-14),
223 libsub-override-perl (= 0.09-2),
224 libsystemd0 (= 250.3-1),
225 libtasn1-6 (= 4.18.0-4),
226 libtinfo6 (= 6.3-2),
227 libtirpc-common (= 1.3.2-2),
228 libtirpc-dev (= 1.3.2-2),
229 libtirpc3 (= 1.3.2-2),
230 libtool (= 2.4.6-15),
231 libubsan1 (= 11.2.0-14),
232 libuchardet0 (= 0.0.7-1),
233 libudev1 (= 250.3-1),
234 libunistring2 (= 0.9.10-6),
235 libuuid1 (= 2.37.3-1),
236 libuv1 (= 1.43.0-1),
237 libxml2 (= 2.9.12+dfsg-5+b1),
238 libzstd1 (= 1.4.8+dfsg-3),
239 linux-libc-dev (= 5.15.15-1),
240 login (= 1:4.8.1-2),
241 lsb-base (= 11.1.0),
242 m4 (= 1.4.18-5),
243 make (= 4.3-4.1),
244 man-db (= 2.9.4-4),
245 mawk (= 1.3.4.20200120-3),
246 ncurses-base (= 6.3-2),
247 ncurses-bin (= 6.3-2),
248 patch (= 2.7.6-7),
249 perl (= 5.32.1-6),
250 perl-base (= 5.32.1-6),
251 perl-modules-5.32 (= 5.32.1-6),
252 pkg-config (= 0.29.2-1),
253 po-debconf (= 1.0.21+nmu1),
254 procps (= 2:3.3.17-6),
255 rpcsvc-proto (= 1.4.2-4),
256 sed (= 4.8-1),
257 sensible-utils (= 0.0.17),
258 sysvinit-utils (= 3.01-1),
259 tar (= 1.34+dfsg-1),
260 util-linux (= 2.37.3-1),
261 xz-utils (= 5.2.5-2),
262 zlib1g (= 1:1.2.11.dfsg-2)
263Environment:
264 DEB_BUILD_OPTIONS="parallel=5"
265 SOURCE_DATE_EPOCH="1643116722""#;
266 let buildinfo: Buildinfo = super::from_str(data).unwrap();
267 assert_eq!(buildinfo.source, "picnic");
268 assert_eq!(
269 buildinfo.version,
270 PackageVersion::try_from("3.0.11-1").unwrap()
271 );
272 assert_eq!(
273 buildinfo.architecture,
274 vec![Architecture::I386, Architecture::Source]
275 );
276 }
277}