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