From e98fb9d5b181e655a2f9a09dca2f05c0c037b59c Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Thu, 4 Jan 2024 10:20:16 +0100 Subject: [PATCH] api-types: factor out FilterType parsing simply keep the previous FromStr implementation and call it the new GroupFilter impl Signed-off-by: Wolfgang Bumiller --- pbs-api-types/src/jobs.rs | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/pbs-api-types/src/jobs.rs b/pbs-api-types/src/jobs.rs index 5b595a67..bc5d749b 100644 --- a/pbs-api-types/src/jobs.rs +++ b/pbs-api-types/src/jobs.rs @@ -1,6 +1,6 @@ use std::str::FromStr; -use anyhow::format_err; +use anyhow::bail; use regex::Regex; use serde::{Deserialize, Serialize}; @@ -408,6 +408,20 @@ impl PartialEq for FilterType { } } +impl std::str::FromStr for FilterType { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + Ok(match s.split_once(':') { + Some(("group", value)) => BACKUP_GROUP_SCHEMA.parse_simple_value(value).map(|_| FilterType::Group(value.to_string()))?, + Some(("type", value)) => FilterType::BackupType(value.parse()?), + Some(("regex", value)) => FilterType::Regex(Regex::new(value)?), + Some((ty, _value)) => bail!("expected 'group', 'type' or 'regex' prefix, got '{}'", ty), + None => bail!("input doesn't match expected format '|regex:REGEX>'"), + }) + } +} + #[derive(Clone, Debug)] pub struct GroupFilter { pub is_exclude: bool, @@ -432,16 +446,9 @@ impl std::str::FromStr for GroupFilter { _ => (false, s), }; - let filter_type = match type_str.split_once(':') { - Some(("group", value)) => BACKUP_GROUP_SCHEMA.parse_simple_value(value).map(|_| FilterType::Group(value.to_string())), - Some(("type", value)) => Ok(FilterType::BackupType(value.parse()?)), - Some(("regex", value)) => Ok(FilterType::Regex(Regex::new(value)?)), - Some((ty, _value)) => Err(format_err!("expected 'group', 'type' or 'regex' prefix, got '{}'", ty)), - None => Err(format_err!("input doesn't match expected format '|regex:REGEX>'")), - }?; Ok(GroupFilter { is_exclude, - filter_type, + filter_type: type_str.parse()?, }) } }