]> git.proxmox.com Git - proxmox-backup.git/blame - src/backup/manifest.rs
src/backup/manifest.rs: improve parser (try_from)
[proxmox-backup.git] / src / backup / manifest.rs
CommitLineData
59e9ba01
DM
1use failure::*;
2use std::convert::TryFrom;
3
4use serde_json::{json, Value};
5
6use crate::backup::BackupDir;
7
8pub const MANIFEST_BLOB_NAME: &str = "index.json.blob";
9
10struct FileInfo {
11 filename: String,
12 size: u64,
13 csum: [u8; 32],
14}
15
16pub struct BackupManifest {
17 snapshot: BackupDir,
18 files: Vec<FileInfo>,
19}
20
21impl BackupManifest {
22
23 pub fn new(snapshot: BackupDir) -> Self {
24 Self { files: Vec::new(), snapshot }
25 }
26
27 pub fn add_file(&mut self, filename: String, size: u64, csum: [u8; 32]) {
28 self.files.push(FileInfo { filename, size, csum });
29 }
30
31 pub fn into_json(self) -> Value {
32 json!({
33 "backup-type": self.snapshot.group().backup_type(),
34 "backup-id": self.snapshot.group().backup_id(),
35 "backup-time": self.snapshot.backup_time().timestamp(),
36 "files": self.files.iter()
37 .fold(Vec::new(), |mut acc, info| {
38 acc.push(json!({
39 "filename": info.filename,
40 "size": info.size,
41 "csum": proxmox::tools::digest_to_hex(&info.csum),
42 }));
43 acc
44 })
45 })
46 }
47
48}
49
50impl TryFrom<Value> for BackupManifest {
51 type Error = Error;
52
53 fn try_from(data: Value) -> Result<Self, Error> {
54
e17d5d86
DM
55 let backup_type = crate::tools::required_string_property(&data, "backup_type")?;
56 let backup_id = crate::tools::required_string_property(&data, "backup_id")?;
57 let backup_time = crate::tools::required_integer_property(&data, "backup_time")?;
59e9ba01
DM
58
59 let snapshot = BackupDir::new(backup_type, backup_id, backup_time);
60
e17d5d86
DM
61 let mut files = Vec::new();
62 for item in crate::tools::required_array_property(&data, "files")?.iter() {
63 let filename = crate::tools::required_string_property(item, "filename")?.to_owned();
64 let csum = crate::tools::required_string_property(item, "csum")?;
65 let csum = proxmox::tools::hex_to_digest(csum)?;
66 let size = crate::tools::required_integer_property(item, "size")? as u64;
67 files.push(FileInfo { filename, size, csum });
68 }
59e9ba01
DM
69
70 Ok(Self { files, snapshot })
71 }
72}