]> git.proxmox.com Git - proxmox-backup.git/commitdiff
src/backup/manifest.rs: improve parser (try_from)
authorDietmar Maurer <dietmar@proxmox.com>
Sun, 13 Oct 2019 06:39:49 +0000 (08:39 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Sun, 13 Oct 2019 06:39:49 +0000 (08:39 +0200)
src/backup/manifest.rs
src/tools.rs

index 8d5d4488edb0c360324eab6028d949abdc42c2f5..7f55aaca97c7abfcc30ed766fd3e548d388b4ca3 100644 (file)
@@ -52,13 +52,20 @@ impl TryFrom<Value> for BackupManifest {
 
     fn try_from(data: Value) -> Result<Self, Error> {
 
-        let backup_type = data["backup_type"].as_str().unwrap();
-        let backup_id = data["backup_id"].as_str().unwrap();
-        let backup_time = data["backup_time"].as_i64().unwrap();
+        let backup_type = crate::tools::required_string_property(&data, "backup_type")?;
+        let backup_id = crate::tools::required_string_property(&data, "backup_id")?;
+        let backup_time = crate::tools::required_integer_property(&data, "backup_time")?;
 
         let snapshot = BackupDir::new(backup_type, backup_id, backup_time);
 
-        let files = Vec::new();
+        let mut files = Vec::new();
+        for item in crate::tools::required_array_property(&data, "files")?.iter() {
+            let filename = crate::tools::required_string_property(item, "filename")?.to_owned();
+            let csum = crate::tools::required_string_property(item, "csum")?;
+            let csum = proxmox::tools::hex_to_digest(csum)?;
+            let size = crate::tools::required_integer_property(item, "size")? as u64;
+            files.push(FileInfo { filename, size, csum });
+        }
 
         Ok(Self { files, snapshot })
     }
index 06301d21ca612594d4264da33c14798c91c8aec6..fb2154d8f94e44b5bf80cebb078ef50ebe4a98f6 100644 (file)
@@ -261,6 +261,13 @@ pub fn required_string_param<'a>(param: &'a Value, name: &str) -> Result<&'a str
     }
 }
 
+pub fn required_string_property<'a>(param: &'a Value, name: &str) -> Result<&'a str, Error> {
+    match param[name].as_str() {
+        Some(s) => Ok(s),
+        None => bail!("missing property '{}'", name),
+    }
+}
+
 pub fn required_integer_param<'a>(param: &'a Value, name: &str) -> Result<i64, Error> {
     match param[name].as_i64() {
         Some(s) => Ok(s),
@@ -268,6 +275,13 @@ pub fn required_integer_param<'a>(param: &'a Value, name: &str) -> Result<i64, E
     }
 }
 
+pub fn required_integer_property<'a>(param: &'a Value, name: &str) -> Result<i64, Error> {
+    match param[name].as_i64() {
+        Some(s) => Ok(s),
+        None => bail!("missing property '{}'", name),
+    }
+}
+
 pub fn required_array_param<'a>(param: &'a Value, name: &str) -> Result<Vec<Value>, Error> {
     match param[name].as_array() {
         Some(s) => Ok(s.to_vec()),
@@ -275,6 +289,13 @@ pub fn required_array_param<'a>(param: &'a Value, name: &str) -> Result<Vec<Valu
     }
 }
 
+pub fn required_array_property<'a>(param: &'a Value, name: &str) -> Result<Vec<Value>, Error> {
+    match param[name].as_array() {
+        Some(s) => Ok(s.to_vec()),
+        None => bail!("missing property '{}'", name),
+    }
+}
+
 pub fn complete_file_name(arg: &str, _param: &HashMap<String, String>) -> Vec<String> {
     let mut result = vec![];