archive_it_client/models/
wasapi.rs1use serde::Deserialize;
2
3#[derive(Debug, Clone, Deserialize)]
4pub struct Page<T> {
5 pub count: u64,
6 pub next: Option<String>,
7 pub previous: Option<String>,
8 pub files: Vec<T>,
9 #[serde(rename = "includes-extra")]
10 pub includes_extra: Option<bool>,
11 #[serde(rename = "request-url")]
12 pub request_url: Option<String>,
13}
14
15#[derive(Debug, Clone, Deserialize)]
16#[serde(rename_all = "kebab-case")]
17pub struct WasapiFile {
18 pub filename: String,
19 pub filetype: String,
20 pub checksums: Checksums,
21 pub account: u64,
22 pub size: u64,
23 pub collection: u64,
24 pub crawl: Option<u64>,
25 pub crawl_time: Option<String>,
26 pub crawl_start: Option<String>,
27 pub store_time: String,
28 pub locations: Vec<String>,
29}
30
31#[derive(Debug, Clone, Deserialize)]
32pub struct Checksums {
33 pub sha1: Option<String>,
34 pub md5: Option<String>,
35}
36
37#[cfg(test)]
38mod tests {
39 use super::WasapiFile;
40
41 #[test]
42 fn wasapi_file_allows_null_crawl_fields() {
43 let file: WasapiFile = serde_json::from_value(serde_json::json!({
44 "filename": "ARCHIVEIT-1.warc.gz",
45 "filetype": "warc",
46 "checksums": { "sha1": "sha1", "md5": "md5" },
47 "account": 1,
48 "size": 123,
49 "collection": 4472,
50 "crawl": null,
51 "crawl-time": null,
52 "crawl-start": null,
53 "store-time": "2025-01-01T00:00:00Z",
54 "locations": ["https://example.invalid/warcs/foo.warc.gz"]
55 }))
56 .unwrap();
57
58 assert_eq!(file.filename, "ARCHIVEIT-1.warc.gz");
59 assert_eq!(file.size, 123);
60 assert_eq!(file.account, 1);
61 assert_eq!(file.collection, 4472);
62 assert_eq!(file.crawl, None);
63 assert_eq!(file.crawl_time, None);
64 assert_eq!(file.crawl_start, None);
65 assert_eq!(file.store_time, "2025-01-01T00:00:00Z");
66 }
67
68 #[test]
69 fn wasapi_file_allows_missing_sha1_when_md5_is_present() {
70 let file: WasapiFile = serde_json::from_value(serde_json::json!({
71 "filename": "ARCHIVEIT-1.warc.gz",
72 "filetype": "warc",
73 "checksums": { "sha1": null, "md5": "md5" },
74 "account": 1,
75 "size": 123,
76 "collection": 4472,
77 "crawl": null,
78 "crawl-time": "2025-01-01T00:00:00Z",
79 "crawl-start": null,
80 "store-time": "2025-01-01T00:00:00Z",
81 "locations": ["https://example.invalid/warcs/foo.warc.gz"]
82 }))
83 .unwrap();
84
85 assert_eq!(file.checksums.sha1, None);
86 assert_eq!(file.checksums.md5.as_deref(), Some("md5"));
87 }
88}