Skip to main content

archive_it_client/models/
wasapi.rs

1use 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}