2 use std
::convert
::TryFrom
;
4 use serde_json
::{json, Value}
;
6 use crate::backup
::BackupDir
;
8 pub const MANIFEST_BLOB_NAME
: &str = "index.json.blob";
16 pub struct BackupManifest
{
23 pub fn new(snapshot
: BackupDir
) -> Self {
24 Self { files: Vec::new(), snapshot }
27 pub fn add_file(&mut self, filename
: String
, size
: u64, csum
: [u8; 32]) {
28 self.files
.push(FileInfo { filename, size, csum }
);
31 pub fn into_json(self) -> Value
{
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
| {
39 "filename": info
.filename
,
41 "csum": proxmox
::tools
::digest_to_hex(&info
.csum
),
50 impl TryFrom
<Value
> for BackupManifest
{
53 fn try_from(data
: Value
) -> Result
<Self, Error
> {
55 use crate::tools
::{required_string_property, required_integer_property, required_array_property}
;
57 let backup_type
= required_string_property(&data
, "backup_type")?
;
58 let backup_id
= required_string_property(&data
, "backup_id")?
;
59 let backup_time
= required_integer_property(&data
, "backup_time")?
;
61 let snapshot
= BackupDir
::new(backup_type
, backup_id
, backup_time
);
63 let mut files
= Vec
::new();
64 for item
in required_array_property(&data
, "files")?
.iter() {
65 let filename
= required_string_property(item
, "filename")?
.to_owned();
66 let csum
= required_string_property(item
, "csum")?
;
67 let csum
= proxmox
::tools
::hex_to_digest(csum
)?
;
68 let size
= required_integer_property(item
, "size")?
as u64;
69 files
.push(FileInfo { filename, size, csum }
);
72 Ok(Self { files, snapshot }
)