&self.backup_id
}
- pub fn parse(path: &str) -> Result<Self, Error> {
-
- let cap = GROUP_PATH_REGEX.captures(path)
- .ok_or_else(|| format_err!("unable to parse backup group path '{}'", path))?;
-
- Ok(Self {
- backup_type: cap.get(1).unwrap().as_str().to_owned(),
- backup_id: cap.get(2).unwrap().as_str().to_owned(),
- })
- }
-
pub fn group_path(&self) -> PathBuf {
let mut relative_path = PathBuf::new();
}
}
+impl std::str::FromStr for BackupGroup {
+ type Err = Error;
+
+ /// Parse a backup group path
+ ///
+ /// This parses strings like `vm/100".
+ fn from_str(path: &str) -> Result<Self, Self::Err> {
+ let cap = GROUP_PATH_REGEX.captures(path)
+ .ok_or_else(|| format_err!("unable to parse backup group path '{}'", path))?;
+
+ Ok(Self {
+ backup_type: cap.get(1).unwrap().as_str().to_owned(),
+ backup_id: cap.get(2).unwrap().as_str().to_owned(),
+ })
+ }
+}
+
/// Uniquely identify a Backup (relative to data store)
///
/// We also call this a backup snaphost.
backup_time.to_rfc3339_opts(SecondsFormat::Secs, true)
}
}
+
impl std::str::FromStr for BackupDir {
type Err = Error;
let client = connect(repo.host(), repo.user())?;
- let group = if let Some(path) = param["group"].as_str() {
- Some(BackupGroup::parse(path)?)
+ let group: Option<BackupGroup> = if let Some(path) = param["group"].as_str() {
+ Some(path.parse()?)
} else {
None
};
let path = tools::required_string_param(¶m, "snapshot")?;
let (backup_type, backup_id, backup_time) = if path.matches('/').count() == 1 {
- let group = BackupGroup::parse(path)?;
+ let group: BackupGroup = path.parse()?;
api_datastore_latest_snapshot(&client, repo.store(), group).await?
} else {
let snapshot: BackupDir = path.parse()?;
let path = format!("api2/json/admin/datastore/{}/prune", repo.store());
let group = tools::required_string_param(¶m, "group")?;
- let group = BackupGroup::parse(group)?;
+ let group: BackupGroup = group.parse()?;
let output_format = get_output_format(¶m);
let path = tools::required_string_param(¶m, "snapshot")?;
let (backup_type, backup_id, backup_time) = if path.matches('/').count() == 1 {
- let group = BackupGroup::parse(path)?;
+ let group: BackupGroup = path.parse()?;
api_datastore_latest_snapshot(&client, repo.store(), group).await?
} else {
let snapshot: BackupDir = path.parse()?;
let archive_name = tools::required_string_param(¶m, "archive-name")?;
let (backup_type, backup_id, backup_time) = if path.matches('/').count() == 1 {
- let group = BackupGroup::parse(path)?;
+ let group: BackupGroup = path.parse()?;
api_datastore_latest_snapshot(&client, repo.store(), group).await?
} else {
let snapshot: BackupDir = path.parse()?;