]>
Commit | Line | Data |
---|---|---|
7cc3473a DM |
1 | use anyhow::{bail, Error}; |
2 | ||
6ef1b649 | 3 | use proxmox_schema::*; |
7cc3473a | 4 | |
6ef1b649 | 5 | const_regex! { |
7cc3473a DM |
6 | BACKUPSPEC_REGEX = r"^([a-zA-Z0-9_-]+\.(pxar|img|conf|log)):(.+)$"; |
7 | } | |
8 | ||
bdfa6370 TL |
9 | pub const BACKUP_SOURCE_SCHEMA: Schema = |
10 | StringSchema::new("Backup source specification ([<label>:<path>]).") | |
11 | .format(&ApiStringFormat::Pattern(&BACKUPSPEC_REGEX)) | |
12 | .schema(); | |
13 | ||
14 | pub enum BackupSpecificationType { | |
15 | PXAR, | |
16 | IMAGE, | |
17 | CONFIG, | |
18 | LOGFILE, | |
19 | } | |
7cc3473a DM |
20 | |
21 | pub struct BackupSpecification { | |
bdfa6370 | 22 | pub archive_name: String, // left part |
7cc3473a DM |
23 | pub config_string: String, // right part |
24 | pub spec_type: BackupSpecificationType, | |
25 | } | |
26 | ||
27 | pub fn parse_backup_specification(value: &str) -> Result<BackupSpecification, Error> { | |
7cc3473a DM |
28 | if let Some(caps) = (BACKUPSPEC_REGEX.regex_obj)().captures(value) { |
29 | let archive_name = caps.get(1).unwrap().as_str().into(); | |
30 | let extension = caps.get(2).unwrap().as_str(); | |
bdfa6370 | 31 | let config_string = caps.get(3).unwrap().as_str().into(); |
7cc3473a DM |
32 | let spec_type = match extension { |
33 | "pxar" => BackupSpecificationType::PXAR, | |
34 | "img" => BackupSpecificationType::IMAGE, | |
35 | "conf" => BackupSpecificationType::CONFIG, | |
36 | "log" => BackupSpecificationType::LOGFILE, | |
37 | _ => bail!("unknown backup source type '{}'", extension), | |
38 | }; | |
bdfa6370 TL |
39 | return Ok(BackupSpecification { |
40 | archive_name, | |
41 | config_string, | |
42 | spec_type, | |
43 | }); | |
7cc3473a DM |
44 | } |
45 | ||
46 | bail!("unable to parse backup source specification '{}'", value); | |
47 | } |