From b22d785c18d51b89cb9aba49656bce10234eb420 Mon Sep 17 00:00:00 2001 From: Thomas Lamprecht Date: Sun, 10 Apr 2022 17:53:42 +0200 Subject: [PATCH] api types: rust fmt Signed-off-by: Thomas Lamprecht --- pbs-api-types/src/crypto.rs | 14 +-- pbs-api-types/src/datastore.rs | 103 ++++++++--------- pbs-api-types/src/human_byte.rs | 31 +++++- pbs-api-types/src/jobs.rs | 159 ++++++++++++++------------- pbs-api-types/src/key_derivation.rs | 7 +- pbs-api-types/src/lib.rs | 111 +++++++++---------- pbs-api-types/src/network.rs | 73 ++++++------ pbs-api-types/src/openid.rs | 54 +++++---- pbs-api-types/src/remote.rs | 35 +++--- pbs-api-types/src/tape/device.rs | 12 +- pbs-api-types/src/tape/drive.rs | 65 +++++------ pbs-api-types/src/tape/media.rs | 48 ++++---- pbs-api-types/src/tape/media_pool.rs | 61 +++++----- pbs-api-types/src/tape/mod.rs | 31 +++--- pbs-api-types/src/traffic_control.rs | 46 ++++---- pbs-api-types/src/user.rs | 64 +++++------ pbs-api-types/src/userid.rs | 51 +++++++-- pbs-api-types/src/zfs.rs | 5 +- 18 files changed, 499 insertions(+), 471 deletions(-) diff --git a/pbs-api-types/src/crypto.rs b/pbs-api-types/src/crypto.rs index bd817034..cdc1ba64 100644 --- a/pbs-api-types/src/crypto.rs +++ b/pbs-api-types/src/crypto.rs @@ -62,18 +62,16 @@ fn as_fingerprint(bytes: &[u8]) -> String { .as_bytes() .chunks(2) .map(|v| unsafe { std::str::from_utf8_unchecked(v) }) // it's a hex string - .collect::>().join(":") + .collect::>() + .join(":") } pub mod bytes_as_fingerprint { use std::mem::MaybeUninit; - use serde::{Deserialize, Serializer, Deserializer}; + use serde::{Deserialize, Deserializer, Serializer}; - pub fn serialize( - bytes: &[u8; 32], - serializer: S, - ) -> Result + pub fn serialize(bytes: &[u8; 32], serializer: S) -> Result where S: Serializer, { @@ -81,9 +79,7 @@ pub mod bytes_as_fingerprint { serializer.serialize_str(&s) } - pub fn deserialize<'de, D>( - deserializer: D, - ) -> Result<[u8; 32], D::Error> + pub fn deserialize<'de, D>(deserializer: D) -> Result<[u8; 32], D::Error> where D: Deserializer<'de>, { diff --git a/pbs-api-types/src/datastore.rs b/pbs-api-types/src/datastore.rs index 158ae140..ea60e023 100644 --- a/pbs-api-types/src/datastore.rs +++ b/pbs-api-types/src/datastore.rs @@ -6,13 +6,12 @@ use proxmox_schema::{ }; use crate::{ - PROXMOX_SAFE_ID_FORMAT, SHA256_HEX_REGEX, SINGLE_LINE_COMMENT_SCHEMA, CryptMode, UPID, - Fingerprint, Userid, Authid, - GC_SCHEDULE_SCHEMA, DATASTORE_NOTIFY_STRING_SCHEMA, PRUNE_SCHEDULE_SCHEMA, - + Authid, CryptMode, Fingerprint, Userid, DATASTORE_NOTIFY_STRING_SCHEMA, GC_SCHEDULE_SCHEMA, + PROXMOX_SAFE_ID_FORMAT, PRUNE_SCHEDULE_SCHEMA, SHA256_HEX_REGEX, SINGLE_LINE_COMMENT_SCHEMA, + UPID, }; -const_regex!{ +const_regex! { pub BACKUP_TYPE_REGEX = concat!(r"^(", BACKUP_TYPE_RE!(), r")$"); pub BACKUP_ID_REGEX = concat!(r"^", BACKUP_ID_RE!(), r"$"); @@ -81,17 +80,19 @@ pub const DATASTORE_MAP_SCHEMA: Schema = StringSchema::new("Datastore mapping.") .type_text("(=)?") .schema(); -pub const DATASTORE_MAP_ARRAY_SCHEMA: Schema = ArraySchema::new( - "Datastore mapping list.", &DATASTORE_MAP_SCHEMA) - .schema(); +pub const DATASTORE_MAP_ARRAY_SCHEMA: Schema = + ArraySchema::new("Datastore mapping list.", &DATASTORE_MAP_SCHEMA).schema(); pub const DATASTORE_MAP_LIST_SCHEMA: Schema = StringSchema::new( "A list of Datastore mappings (or single datastore), comma separated. \ For example 'a=b,e' maps the source datastore 'a' to target 'b and \ all other sources to the default 'e'. If no default is given, only the \ - specified sources are mapped.") - .format(&ApiStringFormat::PropertyString(&DATASTORE_MAP_ARRAY_SCHEMA)) - .schema(); + specified sources are mapped.", +) +.format(&ApiStringFormat::PropertyString( + &DATASTORE_MAP_ARRAY_SCHEMA, +)) +.schema(); pub const PRUNE_SCHEMA_KEEP_DAILY: Schema = IntegerSchema::new("Number of daily backups to keep.") .minimum(1) @@ -153,17 +154,17 @@ pub const PRUNE_SCHEMA_KEEP_YEARLY: Schema = #[serde(rename_all = "kebab-case")] /// Common pruning options pub struct PruneOptions { - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub keep_last: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub keep_hourly: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub keep_daily: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub keep_weekly: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub keep_monthly: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub keep_yearly: Option, } @@ -194,9 +195,10 @@ pub struct DatastoreTuning { pub chunk_order: Option, } -pub const DATASTORE_TUNING_STRING_SCHEMA: Schema = StringSchema::new( - "Datastore tuning options") - .format(&ApiStringFormat::PropertyString(&DatastoreTuning::API_SCHEMA)) +pub const DATASTORE_TUNING_STRING_SCHEMA: Schema = StringSchema::new("Datastore tuning options") + .format(&ApiStringFormat::PropertyString( + &DatastoreTuning::API_SCHEMA, + )) .schema(); #[api( @@ -262,43 +264,43 @@ pub const DATASTORE_TUNING_STRING_SCHEMA: Schema = StringSchema::new( }, } )] -#[derive(Serialize,Deserialize,Updater)] -#[serde(rename_all="kebab-case")] +#[derive(Serialize, Deserialize, Updater)] +#[serde(rename_all = "kebab-case")] /// Datastore configuration properties. pub struct DataStoreConfig { #[updater(skip)] pub name: String, #[updater(skip)] pub path: String, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub gc_schedule: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub prune_schedule: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub keep_last: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub keep_hourly: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub keep_daily: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub keep_weekly: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub keep_monthly: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub keep_yearly: Option, /// If enabled, all backups will be verified right after completion. - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub verify_new: Option, /// Send job email notification to this user - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub notify_user: Option, /// Send notification only for job errors - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub notify: Option, /// Datastore tuning options - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub tuning: Option, } @@ -375,7 +377,6 @@ pub struct SnapshotVerifyState { pub state: VerifyState, } - #[api( properties: { "backup-type": { @@ -616,7 +617,7 @@ impl Default for GarbageCollectionStatus { }, )] #[derive(Serialize, Deserialize)] -#[serde(rename_all="kebab-case")] +#[serde(rename_all = "kebab-case")] /// Overall Datastore status and useful information. pub struct DataStoreStatus { /// Total space (bytes). @@ -626,10 +627,10 @@ pub struct DataStoreStatus { /// Available space (bytes). pub avail: u64, /// Status of last GC - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub gc_status: Option, /// Group/Snapshot counts - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub counts: Option, } @@ -649,7 +650,7 @@ pub struct DataStoreStatus { }, )] #[derive(Serialize, Deserialize)] -#[serde(rename_all="kebab-case")] +#[serde(rename_all = "kebab-case")] /// Status of a Datastore pub struct DataStoreStatusListItem { pub store: String, @@ -660,23 +661,23 @@ pub struct DataStoreStatusListItem { /// The available bytes of the underlying storage. (-1 on error) pub avail: i64, /// A list of usages of the past (last Month). - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub history: Option>>, /// History start time (epoch) - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub history_start: Option, /// History resolution (seconds) - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub history_delta: Option, /// Estimation of the UNIX epoch when the storage will be full. /// This is calculated via a simple Linear Regression (Least /// Squares) of RRD data of the last Month. Missing if there are /// not enough data points yet. If the estimate lies in the past, /// the usage is decreasing or not changing. - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub estimated_full_date: Option, /// An error description, for example, when the datastore could not be looked up - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub error: Option, } @@ -685,7 +686,8 @@ pub const ADMIN_DATASTORE_LIST_SNAPSHOTS_RETURN_TYPE: ReturnType = ReturnType { schema: &ArraySchema::new( "Returns the list of snapshots.", &SnapshotListItem::API_SCHEMA, - ).schema(), + ) + .schema(), }; pub const ADMIN_DATASTORE_LIST_SNAPSHOT_FILES_RETURN_TYPE: ReturnType = ReturnType { @@ -693,7 +695,8 @@ pub const ADMIN_DATASTORE_LIST_SNAPSHOT_FILES_RETURN_TYPE: ReturnType = ReturnTy schema: &ArraySchema::new( "Returns the list of archive files inside a backup snapshots.", &BackupContent::API_SCHEMA, - ).schema(), + ) + .schema(), }; pub const ADMIN_DATASTORE_LIST_GROUPS_RETURN_TYPE: ReturnType = ReturnType { @@ -701,7 +704,8 @@ pub const ADMIN_DATASTORE_LIST_GROUPS_RETURN_TYPE: ReturnType = ReturnType { schema: &ArraySchema::new( "Returns the list of backup groups.", &GroupListItem::API_SCHEMA, - ).schema(), + ) + .schema(), }; pub const ADMIN_DATASTORE_PRUNE_RETURN_TYPE: ReturnType = ReturnType { @@ -709,5 +713,6 @@ pub const ADMIN_DATASTORE_PRUNE_RETURN_TYPE: ReturnType = ReturnType { schema: &ArraySchema::new( "Returns the list of snapshots and a flag indicating if there are kept or removed.", &PruneListItem::API_SCHEMA, - ).schema(), + ) + .schema(), }; diff --git a/pbs-api-types/src/human_byte.rs b/pbs-api-types/src/human_byte.rs index 7793947e..9e1a1893 100644 --- a/pbs-api-types/src/human_byte.rs +++ b/pbs-api-types/src/human_byte.rs @@ -101,7 +101,8 @@ fn strip_unit(v: &str) -> (&str, SizeUnit) { }; let mut unit = SizeUnit::Byte; - (v.strip_suffix(|c: char| match c { + #[rustfmt::skip] + let value = v.strip_suffix(|c: char| match c { 'k' | 'K' if !binary => { unit = SizeUnit::KByte; true } 'm' | 'M' if !binary => { unit = SizeUnit::MByte; true } 'g' | 'G' if !binary => { unit = SizeUnit::GByte; true } @@ -114,7 +115,9 @@ fn strip_unit(v: &str) -> (&str, SizeUnit) { 't' | 'T' if binary => { unit = SizeUnit::Tebi; true } 'p' | 'P' if binary => { unit = SizeUnit::Pebi; true } _ => false - }).unwrap_or(v).trim_end(), unit) + }).unwrap_or(v).trim_end(); + + (value, unit) } /// Byte size which can be displayed in a human friendly way @@ -154,13 +157,19 @@ impl HumanByte { /// Create a new instance with optimal binary unit computed pub fn new_binary(size: f64) -> Self { let unit = SizeUnit::auto_scale(size, true); - HumanByte { size: size / unit.factor(), unit } + HumanByte { + size: size / unit.factor(), + unit, + } } /// Create a new instance with optimal decimal unit computed pub fn new_decimal(size: f64) -> Self { let unit = SizeUnit::auto_scale(size, false); - HumanByte { size: size / unit.factor(), unit } + HumanByte { + size: size / unit.factor(), + unit, + } } /// Returns the size as u64 number of bytes @@ -228,7 +237,12 @@ fn test_human_byte_parser() -> Result<(), Error> { bail!("got unexpected size for '{}' ({} != {})", v, h.size, size); } if h.unit != unit { - bail!("got unexpected unit for '{}' ({:?} != {:?})", v, h.unit, unit); + bail!( + "got unexpected unit for '{}' ({:?} != {:?})", + v, + h.unit, + unit + ); } let new = h.to_string(); @@ -265,7 +279,12 @@ fn test_human_byte_parser() -> Result<(), Error> { assert_eq!(&format!("{:.7}", h), "1.2345678 B"); assert_eq!(&format!("{:.8}", h), "1.2345678 B"); - assert!(test("987654321", 987654321.0, SizeUnit::Byte, "987654321 B")); + assert!(test( + "987654321", + 987654321.0, + SizeUnit::Byte, + "987654321 B" + )); assert!(test("1300b", 1300.0, SizeUnit::Byte, "1300 B")); assert!(test("1300B", 1300.0, SizeUnit::Byte, "1300 B")); diff --git a/pbs-api-types/src/jobs.rs b/pbs-api-types/src/jobs.rs index 0e83da73..654c0477 100644 --- a/pbs-api-types/src/jobs.rs +++ b/pbs-api-types/src/jobs.rs @@ -7,13 +7,12 @@ use serde::{Deserialize, Serialize}; use proxmox_schema::*; use crate::{ - Userid, Authid, RateLimitConfig, - REMOTE_ID_SCHEMA, DRIVE_NAME_SCHEMA, MEDIA_POOL_NAME_SCHEMA, - SINGLE_LINE_COMMENT_SCHEMA, PROXMOX_SAFE_ID_FORMAT, DATASTORE_SCHEMA, - BACKUP_GROUP_SCHEMA, BACKUP_TYPE_SCHEMA, + Authid, RateLimitConfig, Userid, BACKUP_GROUP_SCHEMA, BACKUP_TYPE_SCHEMA, DATASTORE_SCHEMA, + DRIVE_NAME_SCHEMA, MEDIA_POOL_NAME_SCHEMA, PROXMOX_SAFE_ID_FORMAT, REMOTE_ID_SCHEMA, + SINGLE_LINE_COMMENT_SCHEMA, }; -const_regex!{ +const_regex! { /// Regex for verification jobs 'DATASTORE:ACTUAL_JOB_ID' pub VERIFICATION_JOB_WORKER_ID_REGEX = concat!(r"^(", PROXMOX_SAFE_ID_REGEX_STR!(), r"):"); @@ -27,34 +26,41 @@ pub const JOB_ID_SCHEMA: Schema = StringSchema::new("Job ID.") .max_length(32) .schema(); -pub const SYNC_SCHEDULE_SCHEMA: Schema = StringSchema::new( - "Run sync job at specified schedule.") - .format(&ApiStringFormat::VerifyFn(proxmox_time::verify_calendar_event)) +pub const SYNC_SCHEDULE_SCHEMA: Schema = StringSchema::new("Run sync job at specified schedule.") + .format(&ApiStringFormat::VerifyFn( + proxmox_time::verify_calendar_event, + )) .type_text("") .schema(); -pub const GC_SCHEDULE_SCHEMA: Schema = StringSchema::new( - "Run garbage collection job at specified schedule.") - .format(&ApiStringFormat::VerifyFn(proxmox_time::verify_calendar_event)) +pub const GC_SCHEDULE_SCHEMA: Schema = + StringSchema::new("Run garbage collection job at specified schedule.") + .format(&ApiStringFormat::VerifyFn( + proxmox_time::verify_calendar_event, + )) + .type_text("") + .schema(); + +pub const PRUNE_SCHEDULE_SCHEMA: Schema = StringSchema::new("Run prune job at specified schedule.") + .format(&ApiStringFormat::VerifyFn( + proxmox_time::verify_calendar_event, + )) .type_text("") .schema(); -pub const PRUNE_SCHEDULE_SCHEMA: Schema = StringSchema::new( - "Run prune job at specified schedule.") - .format(&ApiStringFormat::VerifyFn(proxmox_time::verify_calendar_event)) - .type_text("") - .schema(); - -pub const VERIFICATION_SCHEDULE_SCHEMA: Schema = StringSchema::new( - "Run verify job at specified schedule.") - .format(&ApiStringFormat::VerifyFn(proxmox_time::verify_calendar_event)) - .type_text("") - .schema(); +pub const VERIFICATION_SCHEDULE_SCHEMA: Schema = + StringSchema::new("Run verify job at specified schedule.") + .format(&ApiStringFormat::VerifyFn( + proxmox_time::verify_calendar_event, + )) + .type_text("") + .schema(); pub const REMOVE_VANISHED_BACKUPS_SCHEMA: Schema = BooleanSchema::new( - "Delete vanished backups. This remove the local copy if the remote backup was deleted.") - .default(false) - .schema(); + "Delete vanished backups. This remove the local copy if the remote backup was deleted.", +) +.default(false) +.schema(); #[api( properties: { @@ -80,17 +86,17 @@ pub const REMOVE_VANISHED_BACKUPS_SCHEMA: Schema = BooleanSchema::new( }, } )] -#[derive(Serialize,Deserialize,Default)] -#[serde(rename_all="kebab-case")] +#[derive(Serialize, Deserialize, Default)] +#[serde(rename_all = "kebab-case")] /// Job Scheduling Status pub struct JobScheduleStatus { - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub next_run: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub last_run_state: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub last_run_upid: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub last_run_endtime: Option, } @@ -134,20 +140,23 @@ pub struct DatastoreNotify { pub sync: Option, } -pub const DATASTORE_NOTIFY_STRING_SCHEMA: Schema = StringSchema::new( - "Datastore notification setting") - .format(&ApiStringFormat::PropertyString(&DatastoreNotify::API_SCHEMA)) - .schema(); +pub const DATASTORE_NOTIFY_STRING_SCHEMA: Schema = + StringSchema::new("Datastore notification setting") + .format(&ApiStringFormat::PropertyString( + &DatastoreNotify::API_SCHEMA, + )) + .schema(); pub const IGNORE_VERIFIED_BACKUPS_SCHEMA: Schema = BooleanSchema::new( - "Do not verify backups that are already verified if their verification is not outdated.") - .default(true) - .schema(); + "Do not verify backups that are already verified if their verification is not outdated.", +) +.default(true) +.schema(); -pub const VERIFICATION_OUTDATED_AFTER_SCHEMA: Schema = IntegerSchema::new( - "Days after that a verification becomes outdated. (0 means always)") - .minimum(0) - .schema(); +pub const VERIFICATION_OUTDATED_AFTER_SCHEMA: Schema = + IntegerSchema::new("Days after that a verification becomes outdated. (0 means always)") + .minimum(0) + .schema(); #[api( properties: { @@ -175,8 +184,8 @@ pub const VERIFICATION_OUTDATED_AFTER_SCHEMA: Schema = IntegerSchema::new( }, } )] -#[derive(Serialize,Deserialize,Updater)] -#[serde(rename_all="kebab-case")] +#[derive(Serialize, Deserialize, Updater)] +#[serde(rename_all = "kebab-case")] /// Verification Job pub struct VerificationJobConfig { /// unique ID to address this job @@ -184,16 +193,16 @@ pub struct VerificationJobConfig { pub id: String, /// the datastore ID this verificaiton job affects pub store: String, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] /// if not set to false, check the age of the last snapshot verification to filter /// out recent ones, depending on 'outdated_after' configuration. pub ignore_verified: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] /// Reverify snapshots after X days, never if 0. Ignored if 'ignore_verified' is false. pub outdated_after: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] /// when to schedule this job in calendar event notation pub schedule: Option, } @@ -208,8 +217,8 @@ pub struct VerificationJobConfig { }, }, )] -#[derive(Serialize,Deserialize)] -#[serde(rename_all="kebab-case")] +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] /// Status of Verification Job pub struct VerificationJobStatus { #[serde(flatten)] @@ -254,23 +263,23 @@ pub struct VerificationJobStatus { }, } )] -#[derive(Serialize,Deserialize,Clone,Updater)] -#[serde(rename_all="kebab-case")] +#[derive(Serialize, Deserialize, Clone, Updater)] +#[serde(rename_all = "kebab-case")] /// Tape Backup Job Setup pub struct TapeBackupJobSetup { pub store: String, pub pool: String, pub drive: String, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub eject_media: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub export_media_set: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub latest_only: Option, /// Send job email notification to this user - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub notify_user: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub group_filter: Option>, } @@ -292,17 +301,17 @@ pub struct TapeBackupJobSetup { }, } )] -#[derive(Serialize,Deserialize,Clone,Updater)] -#[serde(rename_all="kebab-case")] +#[derive(Serialize, Deserialize, Clone, Updater)] +#[serde(rename_all = "kebab-case")] /// Tape Backup Job pub struct TapeBackupJobConfig { #[updater(skip)] pub id: String, #[serde(flatten)] pub setup: TapeBackupJobSetup, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub schedule: Option, } @@ -316,8 +325,8 @@ pub struct TapeBackupJobConfig { }, }, )] -#[derive(Serialize,Deserialize)] -#[serde(rename_all="kebab-case")] +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] /// Status of Tape Backup Job pub struct TapeBackupJobStatus { #[serde(flatten)] @@ -325,7 +334,7 @@ pub struct TapeBackupJobStatus { #[serde(flatten)] pub status: JobScheduleStatus, /// Next tape used (best guess) - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub next_media_label: Option, } @@ -378,7 +387,8 @@ pub const GROUP_FILTER_SCHEMA: Schema = StringSchema::new( .type_text("|group:GROUP|regex:RE>") .schema(); -pub const GROUP_FILTER_LIST_SCHEMA: Schema = ArraySchema::new("List of group filters.", &GROUP_FILTER_SCHEMA).schema(); +pub const GROUP_FILTER_LIST_SCHEMA: Schema = + ArraySchema::new("List of group filters.", &GROUP_FILTER_SCHEMA).schema(); #[api( properties: { @@ -419,24 +429,24 @@ pub const GROUP_FILTER_LIST_SCHEMA: Schema = ArraySchema::new("List of group fil }, } )] -#[derive(Serialize,Deserialize,Clone,Updater)] -#[serde(rename_all="kebab-case")] +#[derive(Serialize, Deserialize, Clone, Updater)] +#[serde(rename_all = "kebab-case")] /// Sync Job pub struct SyncJobConfig { #[updater(skip)] pub id: String, pub store: String, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub owner: Option, pub remote: String, pub remote_store: String, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub remove_vanished: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub schedule: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub group_filter: Option>, #[serde(flatten)] pub limit: RateLimitConfig, @@ -452,9 +462,8 @@ pub struct SyncJobConfig { }, }, )] - -#[derive(Serialize,Deserialize)] -#[serde(rename_all="kebab-case")] +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] /// Status of Sync Job pub struct SyncJobStatus { #[serde(flatten)] diff --git a/pbs-api-types/src/key_derivation.rs b/pbs-api-types/src/key_derivation.rs index 26b86c30..8d6cbc89 100644 --- a/pbs-api-types/src/key_derivation.rs +++ b/pbs-api-types/src/key_derivation.rs @@ -39,7 +39,7 @@ impl Default for Kdf { /// Encryption Key Information pub struct KeyInfo { /// Path to key (if stored in a file) - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub path: Option, pub kdf: Kdf, /// Key creation time @@ -47,10 +47,9 @@ pub struct KeyInfo { /// Key modification time pub modified: i64, /// Key fingerprint - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub fingerprint: Option, /// Password hint - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub hint: Option, } - diff --git a/pbs-api-types/src/lib.rs b/pbs-api-types/src/lib.rs index 421566f7..03119f4a 100644 --- a/pbs-api-types/src/lib.rs +++ b/pbs-api-types/src/lib.rs @@ -6,7 +6,7 @@ pub mod common_regex; pub mod percent_encoding; use proxmox_schema::{ - api, const_regex, ApiStringFormat, ApiType, ArraySchema, Schema, StringSchema, ReturnType, + api, const_regex, ApiStringFormat, ApiType, ArraySchema, ReturnType, Schema, StringSchema, }; use proxmox_time::parse_daily_duration; @@ -68,7 +68,7 @@ pub use user::*; pub use proxmox_schema::upid::*; mod crypto; -pub use crypto::{CryptMode, Fingerprint, bytes_as_fingerprint}; +pub use crypto::{bytes_as_fingerprint, CryptMode, Fingerprint}; pub mod file_restore; @@ -87,7 +87,6 @@ pub use traffic_control::*; mod zfs; pub use zfs::*; - #[rustfmt::skip] #[macro_use] mod local_macros { @@ -160,14 +159,17 @@ pub const CIDR_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&CIDR_REGEX); pub const PVE_CONFIG_DIGEST_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&SHA256_HEX_REGEX); pub const PASSWORD_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&PASSWORD_REGEX); pub const UUID_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&UUID_REGEX); -pub const BLOCKDEVICE_NAME_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&BLOCKDEVICE_NAME_REGEX); -pub const SUBSCRIPTION_KEY_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&SUBSCRIPTION_KEY_REGEX); -pub const SYSTEMD_DATETIME_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&SYSTEMD_DATETIME_REGEX); +pub const BLOCKDEVICE_NAME_FORMAT: ApiStringFormat = + ApiStringFormat::Pattern(&BLOCKDEVICE_NAME_REGEX); +pub const SUBSCRIPTION_KEY_FORMAT: ApiStringFormat = + ApiStringFormat::Pattern(&SUBSCRIPTION_KEY_REGEX); +pub const SYSTEMD_DATETIME_FORMAT: ApiStringFormat = + ApiStringFormat::Pattern(&SYSTEMD_DATETIME_REGEX); pub const HOSTNAME_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&HOSTNAME_REGEX); -pub const OPENSSL_CIPHERS_TLS_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&OPENSSL_CIPHERS_REGEX); +pub const OPENSSL_CIPHERS_TLS_FORMAT: ApiStringFormat = + ApiStringFormat::Pattern(&OPENSSL_CIPHERS_REGEX); -pub const DNS_ALIAS_FORMAT: ApiStringFormat = - ApiStringFormat::Pattern(&DNS_ALIAS_REGEX); +pub const DNS_ALIAS_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&DNS_ALIAS_REGEX); pub const DAILY_DURATION_FORMAT: ApiStringFormat = ApiStringFormat::VerifyFn(|s| parse_daily_duration(s).map(drop)); @@ -175,18 +177,15 @@ pub const DAILY_DURATION_FORMAT: ApiStringFormat = pub const SEARCH_DOMAIN_SCHEMA: Schema = StringSchema::new("Search domain for host-name lookup.").schema(); -pub const FIRST_DNS_SERVER_SCHEMA: Schema = - StringSchema::new("First name server IP address.") +pub const FIRST_DNS_SERVER_SCHEMA: Schema = StringSchema::new("First name server IP address.") .format(&IP_FORMAT) .schema(); -pub const SECOND_DNS_SERVER_SCHEMA: Schema = - StringSchema::new("Second name server IP address.") +pub const SECOND_DNS_SERVER_SCHEMA: Schema = StringSchema::new("Second name server IP address.") .format(&IP_FORMAT) .schema(); -pub const THIRD_DNS_SERVER_SCHEMA: Schema = - StringSchema::new("Third name server IP address.") +pub const THIRD_DNS_SERVER_SCHEMA: Schema = StringSchema::new("Third name server IP address.") .format(&IP_FORMAT) .schema(); @@ -194,48 +193,47 @@ pub const HOSTNAME_SCHEMA: Schema = StringSchema::new("Hostname (as defined in R .format(&HOSTNAME_FORMAT) .schema(); -pub const OPENSSL_CIPHERS_TLS_1_2_SCHEMA: Schema = StringSchema::new("OpenSSL cipher list used by the proxy for TLS <= 1.2") - .format(&OPENSSL_CIPHERS_TLS_FORMAT) - .schema(); +pub const OPENSSL_CIPHERS_TLS_1_2_SCHEMA: Schema = + StringSchema::new("OpenSSL cipher list used by the proxy for TLS <= 1.2") + .format(&OPENSSL_CIPHERS_TLS_FORMAT) + .schema(); -pub const OPENSSL_CIPHERS_TLS_1_3_SCHEMA: Schema = StringSchema::new("OpenSSL ciphersuites list used by the proxy for TLS 1.3") - .format(&OPENSSL_CIPHERS_TLS_FORMAT) - .schema(); +pub const OPENSSL_CIPHERS_TLS_1_3_SCHEMA: Schema = + StringSchema::new("OpenSSL ciphersuites list used by the proxy for TLS 1.3") + .format(&OPENSSL_CIPHERS_TLS_FORMAT) + .schema(); -pub const DNS_NAME_FORMAT: ApiStringFormat = - ApiStringFormat::Pattern(&DNS_NAME_REGEX); +pub const DNS_NAME_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&DNS_NAME_REGEX); -pub const DNS_NAME_OR_IP_FORMAT: ApiStringFormat = - ApiStringFormat::Pattern(&DNS_NAME_OR_IP_REGEX); +pub const DNS_NAME_OR_IP_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&DNS_NAME_OR_IP_REGEX); pub const DNS_NAME_OR_IP_SCHEMA: Schema = StringSchema::new("DNS name or IP address.") .format(&DNS_NAME_OR_IP_FORMAT) .schema(); - pub const NODE_SCHEMA: Schema = StringSchema::new("Node name (or 'localhost')") .format(&HOSTNAME_FORMAT) .schema(); pub const TIME_ZONE_SCHEMA: Schema = StringSchema::new( - "Time zone. The file '/usr/share/zoneinfo/zone.tab' contains the list of valid names.") - .format(&SINGLE_LINE_COMMENT_FORMAT) - .min_length(2) - .max_length(64) - .schema(); + "Time zone. The file '/usr/share/zoneinfo/zone.tab' contains the list of valid names.", +) +.format(&SINGLE_LINE_COMMENT_FORMAT) +.min_length(2) +.max_length(64) +.schema(); -pub const BLOCKDEVICE_NAME_SCHEMA: Schema = StringSchema::new("Block device name (/sys/block/).") - .format(&BLOCKDEVICE_NAME_FORMAT) - .min_length(3) - .max_length(64) - .schema(); +pub const BLOCKDEVICE_NAME_SCHEMA: Schema = + StringSchema::new("Block device name (/sys/block/).") + .format(&BLOCKDEVICE_NAME_FORMAT) + .min_length(3) + .max_length(64) + .schema(); -pub const DISK_ARRAY_SCHEMA: Schema = ArraySchema::new( - "Disk name list.", &BLOCKDEVICE_NAME_SCHEMA) - .schema(); +pub const DISK_ARRAY_SCHEMA: Schema = + ArraySchema::new("Disk name list.", &BLOCKDEVICE_NAME_SCHEMA).schema(); -pub const DISK_LIST_SCHEMA: Schema = StringSchema::new( - "A list of disk names, comma separated.") +pub const DISK_LIST_SCHEMA: Schema = StringSchema::new("A list of disk names, comma separated.") .format(&ApiStringFormat::PropertyString(&DISK_ARRAY_SCHEMA)) .schema(); @@ -282,15 +280,14 @@ pub const MULTI_LINE_COMMENT_SCHEMA: Schema = StringSchema::new("Comment (multip .format(&MULTI_LINE_COMMENT_FORMAT) .schema(); -pub const SUBSCRIPTION_KEY_SCHEMA: Schema = StringSchema::new("Proxmox Backup Server subscription key.") - .format(&SUBSCRIPTION_KEY_FORMAT) - .min_length(15) - .max_length(16) - .schema(); +pub const SUBSCRIPTION_KEY_SCHEMA: Schema = + StringSchema::new("Proxmox Backup Server subscription key.") + .format(&SUBSCRIPTION_KEY_FORMAT) + .min_length(15) + .max_length(16) + .schema(); -pub const SERVICE_ID_SCHEMA: Schema = StringSchema::new("Service ID.") - .max_length(256) - .schema(); +pub const SERVICE_ID_SCHEMA: Schema = StringSchema::new("Service ID.").max_length(256).schema(); pub const PROXMOX_CONFIG_DIGEST_SCHEMA: Schema = StringSchema::new( "Prevent changes if current configuration file has different \ @@ -303,10 +300,8 @@ pub const PROXMOX_CONFIG_DIGEST_SCHEMA: Schema = StringSchema::new( /// API schema format definition for repository URLs pub const BACKUP_REPO_URL: ApiStringFormat = ApiStringFormat::Pattern(&BACKUP_REPO_URL_REGEX); - // Complex type definitions - #[api()] #[derive(Default, Serialize, Deserialize)] /// Storage space usage information. @@ -325,7 +320,6 @@ pub const PASSWORD_HINT_SCHEMA: Schema = StringSchema::new("Password hint.") .max_length(64) .schema(); - #[api()] #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(rename_all = "PascalCase")] @@ -352,11 +346,10 @@ pub struct APTUpdateInfo { /// URL under which the package's changelog can be retrieved pub change_log_url: String, /// Custom extra field for additional package information - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub extra_info: Option, } - #[api()] #[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] @@ -368,7 +361,6 @@ pub enum NodePowerCommand { Shutdown, } - #[api()] #[derive(Eq, PartialEq, Debug, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] @@ -407,19 +399,16 @@ pub struct TaskListItem { /// The authenticated entity who started the task pub user: String, /// The task end time (Epoch) - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub endtime: Option, /// Task end status - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub status: Option, } pub const NODE_TASKS_LIST_TASKS_RETURN_TYPE: ReturnType = ReturnType { optional: false, - schema: &ArraySchema::new( - "A list of tasks.", - &TaskListItem::API_SCHEMA, - ).schema(), + schema: &ArraySchema::new("A list of tasks.", &TaskListItem::API_SCHEMA).schema(), }; #[api()] diff --git a/pbs-api-types/src/network.rs b/pbs-api-types/src/network.rs index f2af3e6f..dda0db1b 100644 --- a/pbs-api-types/src/network.rs +++ b/pbs-api-types/src/network.rs @@ -3,49 +3,43 @@ use serde::{Deserialize, Serialize}; use proxmox_schema::*; use crate::{ + CIDR_FORMAT, CIDR_V4_FORMAT, CIDR_V6_FORMAT, IP_FORMAT, IP_V4_FORMAT, IP_V6_FORMAT, PROXMOX_SAFE_ID_REGEX, - IP_V4_FORMAT, IP_V6_FORMAT, IP_FORMAT, - CIDR_V4_FORMAT, CIDR_V6_FORMAT, CIDR_FORMAT, }; pub const NETWORK_INTERFACE_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&PROXMOX_SAFE_ID_REGEX); -pub const IP_V4_SCHEMA: Schema = - StringSchema::new("IPv4 address.") +pub const IP_V4_SCHEMA: Schema = StringSchema::new("IPv4 address.") .format(&IP_V4_FORMAT) .max_length(15) .schema(); -pub const IP_V6_SCHEMA: Schema = - StringSchema::new("IPv6 address.") +pub const IP_V6_SCHEMA: Schema = StringSchema::new("IPv6 address.") .format(&IP_V6_FORMAT) .max_length(39) .schema(); -pub const IP_SCHEMA: Schema = - StringSchema::new("IP (IPv4 or IPv6) address.") +pub const IP_SCHEMA: Schema = StringSchema::new("IP (IPv4 or IPv6) address.") .format(&IP_FORMAT) .max_length(39) .schema(); -pub const CIDR_V4_SCHEMA: Schema = - StringSchema::new("IPv4 address with netmask (CIDR notation).") +pub const CIDR_V4_SCHEMA: Schema = StringSchema::new("IPv4 address with netmask (CIDR notation).") .format(&CIDR_V4_FORMAT) .max_length(18) .schema(); -pub const CIDR_V6_SCHEMA: Schema = - StringSchema::new("IPv6 address with netmask (CIDR notation).") +pub const CIDR_V6_SCHEMA: Schema = StringSchema::new("IPv6 address with netmask (CIDR notation).") .format(&CIDR_V6_FORMAT) .max_length(43) .schema(); pub const CIDR_SCHEMA: Schema = StringSchema::new("IP address (IPv4 or IPv6) with netmask (CIDR notation).") - .format(&CIDR_FORMAT) - .max_length(43) - .schema(); + .format(&CIDR_FORMAT) + .max_length(43) + .schema(); #[api()] #[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)] @@ -130,14 +124,15 @@ pub const NETWORK_INTERFACE_NAME_SCHEMA: Schema = StringSchema::new("Network int .max_length(15) // libc::IFNAMSIZ-1 .schema(); -pub const NETWORK_INTERFACE_ARRAY_SCHEMA: Schema = ArraySchema::new( - "Network interface list.", &NETWORK_INTERFACE_NAME_SCHEMA) - .schema(); +pub const NETWORK_INTERFACE_ARRAY_SCHEMA: Schema = + ArraySchema::new("Network interface list.", &NETWORK_INTERFACE_NAME_SCHEMA).schema(); -pub const NETWORK_INTERFACE_LIST_SCHEMA: Schema = StringSchema::new( - "A list of network devices, comma separated.") - .format(&ApiStringFormat::PropertyString(&NETWORK_INTERFACE_ARRAY_SCHEMA)) - .schema(); +pub const NETWORK_INTERFACE_LIST_SCHEMA: Schema = + StringSchema::new("A list of network devices, comma separated.") + .format(&ApiStringFormat::PropertyString( + &NETWORK_INTERFACE_ARRAY_SCHEMA, + )) + .schema(); #[api( properties: { @@ -232,48 +227,48 @@ pub struct Interface { /// Interface type #[serde(rename = "type")] pub interface_type: NetworkInterfaceType, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub method: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub method6: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] /// IPv4 address with netmask pub cidr: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] /// IPv4 gateway pub gateway: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] /// IPv6 address with netmask pub cidr6: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] /// IPv6 gateway pub gateway6: Option, - #[serde(skip_serializing_if="Vec::is_empty")] + #[serde(skip_serializing_if = "Vec::is_empty")] pub options: Vec, - #[serde(skip_serializing_if="Vec::is_empty")] + #[serde(skip_serializing_if = "Vec::is_empty")] pub options6: Vec, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comments: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comments6: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] /// Maximum Transmission Unit pub mtu: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub bridge_ports: Option>, /// Enable bridge vlan support. - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub bridge_vlan_aware: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub slaves: Option>, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub bond_mode: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] #[serde(rename = "bond-primary")] pub bond_primary: Option, pub bond_xmit_hash_policy: Option, @@ -281,7 +276,7 @@ pub struct Interface { impl Interface { pub fn new(name: String) -> Self { - Self { + Self { name, interface_type: NetworkInterfaceType::Unknown, autostart: false, diff --git a/pbs-api-types/src/openid.rs b/pbs-api-types/src/openid.rs index 9dcd1f5b..2c7646a3 100644 --- a/pbs-api-types/src/openid.rs +++ b/pbs-api-types/src/openid.rs @@ -1,23 +1,19 @@ use serde::{Deserialize, Serialize}; -use proxmox_schema::{ - api, ApiStringFormat, ArraySchema, Schema, StringSchema, Updater, -}; +use proxmox_schema::{api, ApiStringFormat, ArraySchema, Schema, StringSchema, Updater}; use super::{ - PROXMOX_SAFE_ID_REGEX, PROXMOX_SAFE_ID_FORMAT, REALM_ID_SCHEMA, - SINGLE_LINE_COMMENT_SCHEMA, + PROXMOX_SAFE_ID_FORMAT, PROXMOX_SAFE_ID_REGEX, REALM_ID_SCHEMA, SINGLE_LINE_COMMENT_SCHEMA, }; -pub const OPENID_SCOPE_FORMAT: ApiStringFormat = - ApiStringFormat::Pattern(&PROXMOX_SAFE_ID_REGEX); +pub const OPENID_SCOPE_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&PROXMOX_SAFE_ID_REGEX); pub const OPENID_SCOPE_SCHEMA: Schema = StringSchema::new("OpenID Scope Name.") .format(&OPENID_SCOPE_FORMAT) .schema(); -pub const OPENID_SCOPE_ARRAY_SCHEMA: Schema = ArraySchema::new( - "Array of OpenId Scopes.", &OPENID_SCOPE_SCHEMA).schema(); +pub const OPENID_SCOPE_ARRAY_SCHEMA: Schema = + ArraySchema::new("Array of OpenId Scopes.", &OPENID_SCOPE_SCHEMA).schema(); pub const OPENID_SCOPE_LIST_FORMAT: ApiStringFormat = ApiStringFormat::PropertyString(&OPENID_SCOPE_ARRAY_SCHEMA); @@ -28,15 +24,15 @@ pub const OPENID_SCOPE_LIST_SCHEMA: Schema = StringSchema::new("OpenID Scope Lis .default(OPENID_DEFAILT_SCOPE_LIST) .schema(); -pub const OPENID_ACR_FORMAT: ApiStringFormat = - ApiStringFormat::Pattern(&PROXMOX_SAFE_ID_REGEX); +pub const OPENID_ACR_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&PROXMOX_SAFE_ID_REGEX); -pub const OPENID_ACR_SCHEMA: Schema = StringSchema::new("OpenID Authentication Context Class Reference.") - .format(&OPENID_SCOPE_FORMAT) - .schema(); +pub const OPENID_ACR_SCHEMA: Schema = + StringSchema::new("OpenID Authentication Context Class Reference.") + .format(&OPENID_SCOPE_FORMAT) + .schema(); -pub const OPENID_ACR_ARRAY_SCHEMA: Schema = ArraySchema::new( - "Array of OpenId ACRs.", &OPENID_ACR_SCHEMA).schema(); +pub const OPENID_ACR_ARRAY_SCHEMA: Schema = + ArraySchema::new("Array of OpenId ACRs.", &OPENID_ACR_SCHEMA).schema(); pub const OPENID_ACR_LIST_FORMAT: ApiStringFormat = ApiStringFormat::PropertyString(&OPENID_ACR_ARRAY_SCHEMA); @@ -50,10 +46,12 @@ pub const OPENID_USERNAME_CLAIM_SCHEMA: Schema = StringSchema::new( is up to the identity provider to guarantee the uniqueness. The \ OpenID specification only guarantees that Subject ('sub') is \ unique. Also make sure that the user is not allowed to change that \ - attribute by himself!") - .max_length(64) - .min_length(1) - .format(&PROXMOX_SAFE_ID_FORMAT) .schema(); + attribute by himself!", +) +.max_length(64) +.min_length(1) +.format(&PROXMOX_SAFE_ID_FORMAT) +.schema(); #[api( properties: { @@ -92,7 +90,7 @@ pub const OPENID_USERNAME_CLAIM_SCHEMA: Schema = StringSchema::new( }, )] #[derive(Serialize, Deserialize, Updater)] -#[serde(rename_all="kebab-case")] +#[serde(rename_all = "kebab-case")] /// OpenID configuration properties. pub struct OpenIdRealmConfig { #[updater(skip)] @@ -101,21 +99,21 @@ pub struct OpenIdRealmConfig { pub issuer_url: String, /// OpenID Client ID pub client_id: String, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub scopes: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub acr_values: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub prompt: Option, /// OpenID Client Key - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub client_key: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, /// Automatically create users if they do not exist. - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub autocreate: Option, #[updater(skip)] - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub username_claim: Option, } diff --git a/pbs-api-types/src/remote.rs b/pbs-api-types/src/remote.rs index b7cee5d3..1ebc9d4c 100644 --- a/pbs-api-types/src/remote.rs +++ b/pbs-api-types/src/remote.rs @@ -3,17 +3,19 @@ use serde::{Deserialize, Serialize}; use super::*; use proxmox_schema::*; -pub const REMOTE_PASSWORD_SCHEMA: Schema = StringSchema::new("Password or auth token for remote host.") - .format(&PASSWORD_FORMAT) - .min_length(1) - .max_length(1024) - .schema(); +pub const REMOTE_PASSWORD_SCHEMA: Schema = + StringSchema::new("Password or auth token for remote host.") + .format(&PASSWORD_FORMAT) + .min_length(1) + .max_length(1024) + .schema(); -pub const REMOTE_PASSWORD_BASE64_SCHEMA: Schema = StringSchema::new("Password or auth token for remote host (stored as base64 string).") - .format(&PASSWORD_FORMAT) - .min_length(1) - .max_length(1024) - .schema(); +pub const REMOTE_PASSWORD_BASE64_SCHEMA: Schema = + StringSchema::new("Password or auth token for remote host (stored as base64 string).") + .format(&PASSWORD_FORMAT) + .min_length(1) + .max_length(1024) + .schema(); pub const REMOTE_ID_SCHEMA: Schema = StringSchema::new("Remote ID.") .format(&PROXMOX_SAFE_ID_FORMAT) @@ -21,7 +23,6 @@ pub const REMOTE_ID_SCHEMA: Schema = StringSchema::new("Remote ID.") .max_length(32) .schema(); - #[api( properties: { comment: { @@ -45,17 +46,17 @@ pub const REMOTE_ID_SCHEMA: Schema = StringSchema::new("Remote ID.") }, }, )] -#[derive(Serialize,Deserialize,Updater)] +#[derive(Serialize, Deserialize, Updater)] #[serde(rename_all = "kebab-case")] /// Remote configuration properties. pub struct RemoteConfig { - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, pub host: String, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub port: Option, pub auth_id: Authid, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub fingerprint: Option, } @@ -72,13 +73,13 @@ pub struct RemoteConfig { }, }, )] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] /// Remote properties. pub struct Remote { pub name: String, // Note: The stored password is base64 encoded - #[serde(skip_serializing_if="String::is_empty")] + #[serde(skip_serializing_if = "String::is_empty")] #[serde(with = "proxmox_serde::string_as_base64")] pub password: String, #[serde(flatten)] diff --git a/pbs-api-types/src/tape/device.rs b/pbs-api-types/src/tape/device.rs index 54fad8b0..ff335cdf 100644 --- a/pbs-api-types/src/tape/device.rs +++ b/pbs-api-types/src/tape/device.rs @@ -3,23 +3,23 @@ use ::serde::{Deserialize, Serialize}; use proxmox_schema::api; #[api()] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] /// Optional Device Identification Attributes pub struct OptionalDeviceIdentification { /// Vendor (autodetected) - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub vendor: Option, /// Model (autodetected) - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub model: Option, /// Serial number (autodetected) - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub serial: Option, } #[api()] -#[derive(Debug,Serialize,Deserialize)] +#[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] /// Kind of device pub enum DeviceKind { @@ -36,7 +36,7 @@ pub enum DeviceKind { }, }, )] -#[derive(Debug,Serialize,Deserialize)] +#[derive(Debug, Serialize, Deserialize)] /// Tape device information pub struct TapeDeviceInfo { pub kind: DeviceKind, diff --git a/pbs-api-types/src/tape/drive.rs b/pbs-api-types/src/tape/drive.rs index e177d39f..c8cb077c 100644 --- a/pbs-api-types/src/tape/drive.rs +++ b/pbs-api-types/src/tape/drive.rs @@ -4,13 +4,9 @@ use std::convert::TryFrom; use anyhow::{bail, Error}; use serde::{Deserialize, Serialize}; -use proxmox_schema::{api, Schema, IntegerSchema, StringSchema, Updater}; +use proxmox_schema::{api, IntegerSchema, Schema, StringSchema, Updater}; -use crate::{ - PROXMOX_SAFE_ID_FORMAT, - CHANGER_NAME_SCHEMA, - OptionalDeviceIdentification, -}; +use crate::{OptionalDeviceIdentification, CHANGER_NAME_SCHEMA, PROXMOX_SAFE_ID_FORMAT}; pub const DRIVE_NAME_SCHEMA: Schema = StringSchema::new("Drive Identifier.") .format(&PROXMOX_SAFE_ID_FORMAT) @@ -18,16 +14,15 @@ pub const DRIVE_NAME_SCHEMA: Schema = StringSchema::new("Drive Identifier.") .max_length(32) .schema(); -pub const LTO_DRIVE_PATH_SCHEMA: Schema = StringSchema::new( - "The path to a LTO SCSI-generic tape device (i.e. '/dev/sg0')") - .schema(); +pub const LTO_DRIVE_PATH_SCHEMA: Schema = + StringSchema::new("The path to a LTO SCSI-generic tape device (i.e. '/dev/sg0')").schema(); -pub const CHANGER_DRIVENUM_SCHEMA: Schema = IntegerSchema::new( - "Associated changer drive number (requires option changer)") - .minimum(0) - .maximum(255) - .default(0) - .schema(); +pub const CHANGER_DRIVENUM_SCHEMA: Schema = + IntegerSchema::new("Associated changer drive number (requires option changer)") + .minimum(0) + .maximum(255) + .default(0) + .schema(); #[api( properties: { @@ -36,7 +31,7 @@ pub const CHANGER_DRIVENUM_SCHEMA: Schema = IntegerSchema::new( } } )] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] /// Simulate tape drives (only for test and debug) #[serde(rename_all = "kebab-case")] pub struct VirtualTapeDrive { @@ -44,7 +39,7 @@ pub struct VirtualTapeDrive { /// Path to directory pub path: String, /// Virtual tape size - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub max_size: Option, } @@ -66,16 +61,16 @@ pub struct VirtualTapeDrive { }, } )] -#[derive(Serialize,Deserialize,Updater)] +#[derive(Serialize, Deserialize, Updater)] #[serde(rename_all = "kebab-case")] /// Lto SCSI tape driver pub struct LtoTapeDrive { #[updater(skip)] pub name: String, pub path: String, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub changer: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub changer_drivenum: Option, } @@ -89,7 +84,7 @@ pub struct LtoTapeDrive { }, }, )] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] /// Drive list entry pub struct DriveListEntry { @@ -98,12 +93,12 @@ pub struct DriveListEntry { #[serde(flatten)] pub info: OptionalDeviceIdentification, /// the state of the drive if locked - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub state: Option, } #[api()] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] /// Medium auxiliary memory attributes (MAM) pub struct MamAttribute { /// Attribute id @@ -115,7 +110,7 @@ pub struct MamAttribute { } #[api()] -#[derive(Serialize,Deserialize,Copy,Clone,Debug)] +#[derive(Serialize, Deserialize, Copy, Clone, Debug)] pub enum TapeDensity { /// Unknown (no media loaded) Unknown, @@ -168,7 +163,7 @@ impl TryFrom for TapeDensity { }, }, )] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] /// Drive/Media status for Lto SCSI drives. /// @@ -190,35 +185,35 @@ pub struct LtoDriveAndMediaStatus { /// Tape density pub density: TapeDensity, /// Media is write protected - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub write_protect: Option, /// Tape Alert Flags - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub alert_flags: Option, /// Current file number - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub file_number: Option, /// Current block number - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub block_number: Option, /// Medium Manufacture Date (epoch) - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub manufactured: Option, /// Total Bytes Read in Medium Life - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub bytes_read: Option, /// Total Bytes Written in Medium Life - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub bytes_written: Option, /// Number of mounts for the current volume (i.e., Thread Count) - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub volume_mounts: Option, /// Count of the total number of times the medium has passed over /// the head. - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub medium_passes: Option, /// Estimated tape wearout factor (assuming max. 16000 end-to-end passes) - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub medium_wearout: Option, } diff --git a/pbs-api-types/src/tape/media.rs b/pbs-api-types/src/tape/media.rs index 61d7be04..c2c25da0 100644 --- a/pbs-api-types/src/tape/media.rs +++ b/pbs-api-types/src/tape/media.rs @@ -3,19 +3,15 @@ use ::serde::{Deserialize, Serialize}; use proxmox_schema::*; use proxmox_uuid::Uuid; -use crate::{ - UUID_FORMAT, - MediaStatus, - MediaLocation, -}; +use crate::{MediaLocation, MediaStatus, UUID_FORMAT}; -pub const MEDIA_SET_UUID_SCHEMA: Schema = - StringSchema::new("MediaSet Uuid (We use the all-zero Uuid to reseve an empty media for a specific pool).") - .format(&UUID_FORMAT) - .schema(); +pub const MEDIA_SET_UUID_SCHEMA: Schema = StringSchema::new( + "MediaSet Uuid (We use the all-zero Uuid to reseve an empty media for a specific pool).", +) +.format(&UUID_FORMAT) +.schema(); -pub const MEDIA_UUID_SCHEMA: Schema = - StringSchema::new("Media Uuid.") +pub const MEDIA_UUID_SCHEMA: Schema = StringSchema::new("Media Uuid.") .format(&UUID_FORMAT) .schema(); @@ -26,7 +22,7 @@ pub const MEDIA_UUID_SCHEMA: Schema = }, }, )] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] /// Media Set list entry pub struct MediaSetListEntry { @@ -56,7 +52,7 @@ pub struct MediaSetListEntry { }, }, )] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] /// Media list entry pub struct MediaListEntry { @@ -72,18 +68,18 @@ pub struct MediaListEntry { /// Catalog status OK pub catalog: bool, /// Media set name - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub media_set_name: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub media_set_uuid: Option, /// Media set seq_nr - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub seq_nr: Option, /// MediaSet creation time stamp - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub media_set_ctime: Option, /// Media Pool - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub pool: Option, } @@ -98,7 +94,7 @@ pub struct MediaListEntry { }, }, )] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] /// Media label info pub struct MediaIdFlat { @@ -110,18 +106,18 @@ pub struct MediaIdFlat { pub ctime: i64, // All MediaSet properties are optional here /// MediaSet Pool - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub pool: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub media_set_uuid: Option, /// MediaSet media sequence number - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub seq_nr: Option, /// MediaSet Creation time stamp - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub media_set_ctime: Option, /// Encryption key fingerprint - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub encryption_key_fingerprint: Option, } @@ -133,7 +129,7 @@ pub struct MediaIdFlat { }, }, )] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] /// Label with optional Uuid pub struct LabelUuidMap { @@ -153,7 +149,7 @@ pub struct LabelUuidMap { }, }, )] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] /// Media content list entry pub struct MediaContentEntry { diff --git a/pbs-api-types/src/tape/media_pool.rs b/pbs-api-types/src/tape/media_pool.rs index c0cba2bd..c3eacec7 100644 --- a/pbs-api-types/src/tape/media_pool.rs +++ b/pbs-api-types/src/tape/media_pool.rs @@ -9,14 +9,12 @@ use std::str::FromStr; use anyhow::Error; use serde::{Deserialize, Serialize}; -use proxmox_schema::{api, Schema, StringSchema, ApiStringFormat, Updater}; +use proxmox_schema::{api, ApiStringFormat, Schema, StringSchema, Updater}; use proxmox_time::{CalendarEvent, TimeSpan}; use crate::{ - PROXMOX_SAFE_ID_FORMAT, - SINGLE_LINE_COMMENT_FORMAT, - SINGLE_LINE_COMMENT_SCHEMA, + PROXMOX_SAFE_ID_FORMAT, SINGLE_LINE_COMMENT_FORMAT, SINGLE_LINE_COMMENT_SCHEMA, TAPE_ENCRYPTION_KEY_FINGERPRINT_SCHEMA, }; @@ -27,19 +25,22 @@ pub const MEDIA_POOL_NAME_SCHEMA: Schema = StringSchema::new("Media pool name.") .schema(); pub const MEDIA_SET_NAMING_TEMPLATE_SCHEMA: Schema = StringSchema::new( - "Media set naming template (may contain strftime() time format specifications).") - .format(&SINGLE_LINE_COMMENT_FORMAT) - .min_length(2) - .max_length(64) - .schema(); - -pub const MEDIA_SET_ALLOCATION_POLICY_FORMAT: ApiStringFormat = - ApiStringFormat::VerifyFn(|s| { MediaSetPolicy::from_str(s)?; Ok(()) }); - -pub const MEDIA_SET_ALLOCATION_POLICY_SCHEMA: Schema = StringSchema::new( - "Media set allocation policy ('continue', 'always', or a calendar event).") - .format(&MEDIA_SET_ALLOCATION_POLICY_FORMAT) - .schema(); + "Media set naming template (may contain strftime() time format specifications).", +) +.format(&SINGLE_LINE_COMMENT_FORMAT) +.min_length(2) +.max_length(64) +.schema(); + +pub const MEDIA_SET_ALLOCATION_POLICY_FORMAT: ApiStringFormat = ApiStringFormat::VerifyFn(|s| { + MediaSetPolicy::from_str(s)?; + Ok(()) +}); + +pub const MEDIA_SET_ALLOCATION_POLICY_SCHEMA: Schema = + StringSchema::new("Media set allocation policy ('continue', 'always', or a calendar event).") + .format(&MEDIA_SET_ALLOCATION_POLICY_FORMAT) + .schema(); /// Media set allocation policy pub enum MediaSetPolicy { @@ -68,13 +69,15 @@ impl std::str::FromStr for MediaSetPolicy { } } -pub const MEDIA_RETENTION_POLICY_FORMAT: ApiStringFormat = - ApiStringFormat::VerifyFn(|s| { RetentionPolicy::from_str(s)?; Ok(()) }); +pub const MEDIA_RETENTION_POLICY_FORMAT: ApiStringFormat = ApiStringFormat::VerifyFn(|s| { + RetentionPolicy::from_str(s)?; + Ok(()) +}); -pub const MEDIA_RETENTION_POLICY_SCHEMA: Schema = StringSchema::new( - "Media retention policy ('overwrite', 'keep', or time span).") - .format(&MEDIA_RETENTION_POLICY_FORMAT) - .schema(); +pub const MEDIA_RETENTION_POLICY_SCHEMA: Schema = + StringSchema::new("Media retention policy ('overwrite', 'keep', or time span).") + .format(&MEDIA_RETENTION_POLICY_FORMAT) + .schema(); /// Media retention Policy pub enum RetentionPolicy { @@ -130,29 +133,29 @@ impl std::str::FromStr for RetentionPolicy { }, }, )] -#[derive(Serialize,Deserialize,Updater)] +#[derive(Serialize, Deserialize, Updater)] /// Media pool configuration pub struct MediaPoolConfig { /// The pool name #[updater(skip)] pub name: String, /// Media Set allocation policy - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub allocation: Option, /// Media retention policy - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub retention: Option, /// Media set naming template (default "%c") /// /// The template is UTF8 text, and can include strftime time /// format specifications. - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub template: Option, /// Encryption key fingerprint /// /// If set, encrypt all data using the specified key. - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub encrypt: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, } diff --git a/pbs-api-types/src/tape/mod.rs b/pbs-api-types/src/tape/mod.rs index 58777a52..c90ebd0e 100644 --- a/pbs-api-types/src/tape/mod.rs +++ b/pbs-api-types/src/tape/mod.rs @@ -24,31 +24,28 @@ pub use media::*; use serde::{Deserialize, Serialize}; -use proxmox_schema::{api, const_regex, Schema, StringSchema, ApiStringFormat}; +use proxmox_schema::{api, const_regex, ApiStringFormat, Schema, StringSchema}; use proxmox_uuid::Uuid; -use crate::{ - FINGERPRINT_SHA256_FORMAT, BACKUP_ID_SCHEMA, BACKUP_TYPE_SCHEMA, -}; +use crate::{BACKUP_ID_SCHEMA, BACKUP_TYPE_SCHEMA, FINGERPRINT_SHA256_FORMAT}; -const_regex!{ +const_regex! { pub TAPE_RESTORE_SNAPSHOT_REGEX = concat!(r"^", PROXMOX_SAFE_ID_REGEX_STR!(), r":", SNAPSHOT_PATH_REGEX_STR!(), r"$"); } pub const TAPE_RESTORE_SNAPSHOT_FORMAT: ApiStringFormat = ApiStringFormat::Pattern(&TAPE_RESTORE_SNAPSHOT_REGEX); -pub const TAPE_ENCRYPTION_KEY_FINGERPRINT_SCHEMA: Schema = StringSchema::new( - "Tape encryption key fingerprint (sha256)." -) - .format(&FINGERPRINT_SHA256_FORMAT) - .schema(); +pub const TAPE_ENCRYPTION_KEY_FINGERPRINT_SCHEMA: Schema = + StringSchema::new("Tape encryption key fingerprint (sha256).") + .format(&FINGERPRINT_SHA256_FORMAT) + .schema(); -pub const TAPE_RESTORE_SNAPSHOT_SCHEMA: Schema = StringSchema::new( - "A snapshot in the format: 'store:type/id/time") - .format(&TAPE_RESTORE_SNAPSHOT_FORMAT) - .type_text("store:type/id/time") - .schema(); +pub const TAPE_RESTORE_SNAPSHOT_SCHEMA: Schema = + StringSchema::new("A snapshot in the format: 'store:type/id/time") + .format(&TAPE_RESTORE_SNAPSHOT_FORMAT) + .type_text("store:type/id/time") + .schema(); #[api( properties: { @@ -78,8 +75,8 @@ pub const TAPE_RESTORE_SNAPSHOT_SCHEMA: Schema = StringSchema::new( }, }, )] -#[derive(Serialize,Deserialize)] -#[serde(rename_all="kebab-case")] +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] /// Content list filter parameters pub struct MediaContentListFilter { pub pool: Option, diff --git a/pbs-api-types/src/traffic_control.rs b/pbs-api-types/src/traffic_control.rs index a1fcb7b5..d29f18b4 100644 --- a/pbs-api-types/src/traffic_control.rs +++ b/pbs-api-types/src/traffic_control.rs @@ -1,16 +1,16 @@ use serde::{Deserialize, Serialize}; -use proxmox_schema::{api, Schema, IntegerSchema, StringSchema, Updater}; +use proxmox_schema::{api, IntegerSchema, Schema, StringSchema, Updater}; use crate::{ - HumanByte, CIDR_SCHEMA, DAILY_DURATION_FORMAT, - PROXMOX_SAFE_ID_FORMAT, SINGLE_LINE_COMMENT_SCHEMA, + HumanByte, CIDR_SCHEMA, DAILY_DURATION_FORMAT, PROXMOX_SAFE_ID_FORMAT, + SINGLE_LINE_COMMENT_SCHEMA, }; -pub const TRAFFIC_CONTROL_TIMEFRAME_SCHEMA: Schema = StringSchema::new( - "Timeframe to specify when the rule is actice.") - .format(&DAILY_DURATION_FORMAT) - .schema(); +pub const TRAFFIC_CONTROL_TIMEFRAME_SCHEMA: Schema = + StringSchema::new("Timeframe to specify when the rule is actice.") + .format(&DAILY_DURATION_FORMAT) + .schema(); pub const TRAFFIC_CONTROL_ID_SCHEMA: Schema = StringSchema::new("Rule ID.") .format(&PROXMOX_SAFE_ID_FORMAT) @@ -18,15 +18,15 @@ pub const TRAFFIC_CONTROL_ID_SCHEMA: Schema = StringSchema::new("Rule ID.") .max_length(32) .schema(); -pub const TRAFFIC_CONTROL_RATE_SCHEMA: Schema = IntegerSchema::new( - "Rate limit (for Token bucket filter) in bytes/second.") - .minimum(100_000) - .schema(); +pub const TRAFFIC_CONTROL_RATE_SCHEMA: Schema = + IntegerSchema::new("Rate limit (for Token bucket filter) in bytes/second.") + .minimum(100_000) + .schema(); -pub const TRAFFIC_CONTROL_BURST_SCHEMA: Schema = IntegerSchema::new( - "Size of the token bucket (for Token bucket filter) in bytes.") - .minimum(1000) - .schema(); +pub const TRAFFIC_CONTROL_BURST_SCHEMA: Schema = + IntegerSchema::new("Size of the token bucket (for Token bucket filter) in bytes.") + .minimum(1000) + .schema(); #[api( properties: { @@ -48,17 +48,17 @@ pub const TRAFFIC_CONTROL_BURST_SCHEMA: Schema = IntegerSchema::new( }, }, )] -#[derive(Serialize,Deserialize,Default,Clone,Updater)] +#[derive(Serialize, Deserialize, Default, Clone, Updater)] #[serde(rename_all = "kebab-case")] /// Rate Limit Configuration pub struct RateLimitConfig { - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub rate_in: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub burst_in: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub rate_out: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub burst_out: Option, } @@ -100,13 +100,13 @@ impl RateLimitConfig { }, }, )] -#[derive(Serialize,Deserialize, Updater)] +#[derive(Serialize, Deserialize, Updater)] #[serde(rename_all = "kebab-case")] /// Traffic control rule pub struct TrafficControlRule { #[updater(skip)] pub name: String, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, /// Rule applies to Source IPs within this networks pub network: Vec, @@ -117,6 +117,6 @@ pub struct TrafficControlRule { // #[serde(skip_serializing_if="Option::is_none")] // pub shared: Option, /// Enable the rule at specific times - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub timeframe: Option>, } diff --git a/pbs-api-types/src/user.rs b/pbs-api-types/src/user.rs index 94ed07c0..56d82537 100644 --- a/pbs-api-types/src/user.rs +++ b/pbs-api-types/src/user.rs @@ -1,22 +1,22 @@ use serde::{Deserialize, Serialize}; -use proxmox_schema::{ - api, BooleanSchema, IntegerSchema, Schema, StringSchema, Updater, -}; +use proxmox_schema::{api, BooleanSchema, IntegerSchema, Schema, StringSchema, Updater}; -use super::{SINGLE_LINE_COMMENT_FORMAT, SINGLE_LINE_COMMENT_SCHEMA}; use super::userid::{Authid, Userid, PROXMOX_TOKEN_ID_SCHEMA}; +use super::{SINGLE_LINE_COMMENT_FORMAT, SINGLE_LINE_COMMENT_SCHEMA}; pub const ENABLE_USER_SCHEMA: Schema = BooleanSchema::new( - "Enable the account (default). You can set this to '0' to disable the account.") - .default(true) - .schema(); + "Enable the account (default). You can set this to '0' to disable the account.", +) +.default(true) +.schema(); pub const EXPIRE_USER_SCHEMA: Schema = IntegerSchema::new( - "Account expiration date (seconds since epoch). '0' means no expiration date.") - .default(0) - .minimum(0) - .schema(); + "Account expiration date (seconds since epoch). '0' means no expiration date.", +) +.default(0) +.minimum(0) +.schema(); pub const FIRST_NAME_SCHEMA: Schema = StringSchema::new("First name.") .format(&SINGLE_LINE_COMMENT_FORMAT) @@ -75,23 +75,23 @@ pub const EMAIL_SCHEMA: Schema = StringSchema::new("E-Mail Address.") }, } )] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] /// User properties with added list of ApiTokens pub struct UserWithTokens { pub userid: Userid, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub enable: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub expire: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub firstname: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub lastname: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub email: Option, - #[serde(skip_serializing_if="Vec::is_empty", default)] + #[serde(skip_serializing_if = "Vec::is_empty", default)] pub tokens: Vec, } @@ -114,15 +114,15 @@ pub struct UserWithTokens { }, } )] -#[derive(Serialize,Deserialize)] +#[derive(Serialize, Deserialize)] /// ApiToken properties. pub struct ApiToken { pub tokenid: Authid, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub enable: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub expire: Option, } @@ -132,7 +132,7 @@ impl ApiToken { return false; } if let Some(expire) = self.expire { - let now = proxmox_time::epoch_i64(); + let now = proxmox_time::epoch_i64(); if expire > 0 && expire <= now { return false; } @@ -172,22 +172,22 @@ impl ApiToken { }, } )] -#[derive(Serialize,Deserialize,Updater)] +#[derive(Serialize, Deserialize, Updater)] /// User properties. pub struct User { #[updater(skip)] pub userid: Userid, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub comment: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub enable: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub expire: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub firstname: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub lastname: Option, - #[serde(skip_serializing_if="Option::is_none")] + #[serde(skip_serializing_if = "Option::is_none")] pub email: Option, } @@ -197,7 +197,7 @@ impl User { return false; } if let Some(expire) = self.expire { - let now = proxmox_time::epoch_i64(); + let now = proxmox_time::epoch_i64(); if expire > 0 && expire <= now { return false; } diff --git a/pbs-api-types/src/userid.rs b/pbs-api-types/src/userid.rs index 12843c3d..90dcd02e 100644 --- a/pbs-api-types/src/userid.rs +++ b/pbs-api-types/src/userid.rs @@ -39,15 +39,35 @@ use proxmox_schema::{ // slash is not allowed because it is used as pve API delimiter // also see "man useradd" #[macro_export] -macro_rules! USER_NAME_REGEX_STR { () => (r"(?:[^\s:/[:cntrl:]]+)") } +macro_rules! USER_NAME_REGEX_STR { + () => { + r"(?:[^\s:/[:cntrl:]]+)" + }; +} #[macro_export] -macro_rules! GROUP_NAME_REGEX_STR { () => (USER_NAME_REGEX_STR!()) } +macro_rules! GROUP_NAME_REGEX_STR { + () => { + USER_NAME_REGEX_STR!() + }; +} #[macro_export] -macro_rules! TOKEN_NAME_REGEX_STR { () => (PROXMOX_SAFE_ID_REGEX_STR!()) } +macro_rules! TOKEN_NAME_REGEX_STR { + () => { + PROXMOX_SAFE_ID_REGEX_STR!() + }; +} #[macro_export] -macro_rules! USER_ID_REGEX_STR { () => (concat!(USER_NAME_REGEX_STR!(), r"@", PROXMOX_SAFE_ID_REGEX_STR!())) } +macro_rules! USER_ID_REGEX_STR { + () => { + concat!(USER_NAME_REGEX_STR!(), r"@", PROXMOX_SAFE_ID_REGEX_STR!()) + }; +} #[macro_export] -macro_rules! APITOKEN_ID_REGEX_STR { () => (concat!(USER_ID_REGEX_STR!() , r"!", TOKEN_NAME_REGEX_STR!())) } +macro_rules! APITOKEN_ID_REGEX_STR { + () => { + concat!(USER_ID_REGEX_STR!(), r"!", TOKEN_NAME_REGEX_STR!()) + }; +} const_regex! { pub PROXMOX_USER_NAME_REGEX = concat!(r"^", USER_NAME_REGEX_STR!(), r"$"); @@ -238,7 +258,8 @@ impl TryFrom for Realm { type Error = Error; fn try_from(s: String) -> Result { - PROXMOX_AUTH_REALM_STRING_SCHEMA.check_constraints(&s) + PROXMOX_AUTH_REALM_STRING_SCHEMA + .check_constraints(&s) .map_err(|_| format_err!("invalid realm"))?; Ok(Self(s)) @@ -249,7 +270,8 @@ impl<'a> TryFrom<&'a str> for &'a RealmRef { type Error = Error; fn try_from(s: &'a str) -> Result<&'a RealmRef, Error> { - PROXMOX_AUTH_REALM_STRING_SCHEMA.check_constraints(s) + PROXMOX_AUTH_REALM_STRING_SCHEMA + .check_constraints(s) .map_err(|_| format_err!("invalid realm"))?; Ok(RealmRef::new(s)) @@ -482,7 +504,8 @@ impl std::str::FromStr for Userid { bail!("invalid user name in user id"); } - PROXMOX_AUTH_REALM_STRING_SCHEMA.check_constraints(realm) + PROXMOX_AUTH_REALM_STRING_SCHEMA + .check_constraints(realm) .map_err(|_| format_err!("invalid realm in user id"))?; Ok(Self::from((UsernameRef::new(name), RealmRef::new(realm)))) @@ -503,7 +526,8 @@ impl TryFrom for Userid { bail!("invalid user name in user id"); } - PROXMOX_AUTH_REALM_STRING_SCHEMA.check_constraints(&data[(name_len + 1)..]) + PROXMOX_AUTH_REALM_STRING_SCHEMA + .check_constraints(&data[(name_len + 1)..]) .map_err(|_| format_err!("invalid realm in user id"))?; Ok(Self { data, name_len }) @@ -532,7 +556,7 @@ impl PartialEq for Userid { #[derive(Clone, Debug, Eq, PartialEq, Hash, UpdaterType)] pub struct Authid { user: Userid, - tokenname: Option + tokenname: Option, } impl ApiType for Authid { @@ -652,7 +676,7 @@ impl TryFrom for Authid { data.truncate(realm_end); - let user:Userid = data.parse()?; + let user: Userid = data.parse()?; Ok(Self { user, tokenname }) } @@ -679,7 +703,10 @@ fn test_token_id() { let token_userid = auth_id.user(); assert_eq!(&userid, token_userid); assert!(auth_id.is_token()); - assert_eq!(auth_id.tokenname().expect("Token has tokenname").as_str(), TokennameRef::new("bar").as_str()); + assert_eq!( + auth_id.tokenname().expect("Token has tokenname").as_str(), + TokennameRef::new("bar").as_str() + ); assert_eq!(auth_id.to_string(), "test@pam!bar".to_string()); } diff --git a/pbs-api-types/src/zfs.rs b/pbs-api-types/src/zfs.rs index 5fe49561..b62af6cb 100644 --- a/pbs-api-types/src/zfs.rs +++ b/pbs-api-types/src/zfs.rs @@ -6,8 +6,7 @@ const_regex! { pub ZPOOL_NAME_REGEX = r"^[a-zA-Z][a-z0-9A-Z\-_.:]+$"; } -pub const ZFS_ASHIFT_SCHEMA: Schema = IntegerSchema::new( - "Pool sector size exponent.") +pub const ZFS_ASHIFT_SCHEMA: Schema = IntegerSchema::new("Pool sector size exponent.") .minimum(9) .maximum(16) .default(12) @@ -59,7 +58,7 @@ pub enum ZfsRaidLevel { #[api()] #[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all="kebab-case")] +#[serde(rename_all = "kebab-case")] /// zpool list item pub struct ZpoolListItem { /// zpool name -- 2.39.5