diff --git a/pbs-api-types/src/lib.rs b/pbs-api-types/src/lib.rs index 6bae4a52..e73f1f8a 100644 --- a/pbs-api-types/src/lib.rs +++ b/pbs-api-types/src/lib.rs @@ -143,6 +143,9 @@ pub use ad::*; mod remote; pub use remote::*; +mod pathpatterns; +pub use pathpatterns::*; + mod tape; pub use tape::*; diff --git a/pbs-api-types/src/pathpatterns.rs b/pbs-api-types/src/pathpatterns.rs new file mode 100644 index 00000000..c40926a4 --- /dev/null +++ b/pbs-api-types/src/pathpatterns.rs @@ -0,0 +1,55 @@ +use proxmox_schema::{const_regex, ApiStringFormat, ApiType, ArraySchema, Schema, StringSchema}; + +use serde::{Deserialize, Serialize}; + +const_regex! { + pub PATH_PATTERN_REGEX = concat!(r"^.+[^\\]$"); +} + +pub const PATH_PATTERN_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&PATH_PATTERN_REGEX); + +pub const PATH_PATTERN_SCHEMA: Schema = + StringSchema::new("Path or match pattern for matching filenames.") + .format(&PATH_PATTERN_FORMAT) + .schema(); + +pub const PATH_PATTERN_LIST_SCHEMA: Schema = ArraySchema::new( + "List of paths or match patterns for matching filenames.", + &PATH_PATTERN_SCHEMA, +) +.schema(); + +#[derive(Default, Deserialize, Serialize)] +/// Path or path pattern for filename matching +pub struct PathPattern { + pattern: String, +} + +impl ApiType for PathPattern { + const API_SCHEMA: Schema = PATH_PATTERN_SCHEMA; +} + +impl AsRef<[u8]> for PathPattern { + fn as_ref(&self) -> &[u8] { + self.pattern.as_bytes() + } +} + +#[derive(Default, Deserialize, Serialize)] +/// Array of paths and/or path patterns for filename matching +pub struct PathPatterns { + patterns: Vec, +} + +impl ApiType for PathPatterns { + const API_SCHEMA: Schema = PATH_PATTERN_LIST_SCHEMA; +} + +impl IntoIterator for PathPatterns { + type Item = PathPattern; + type IntoIter = std::vec::IntoIter; + + fn into_iter(self) -> Self::IntoIter { + self.patterns.into_iter() + } +}