]> git.proxmox.com Git - proxmox-backup.git/blob - src/tape/media_set.rs
typo fixes all over the place
[proxmox-backup.git] / src / tape / media_set.rs
1 use anyhow::{bail, Error};
2 use serde::{Serialize, Deserialize};
3
4 use proxmox::tools::Uuid;
5
6 /// MediaSet - Ordered group of media
7 #[derive(Debug, Serialize, Deserialize)]
8 pub struct MediaSet {
9 /// Unique media set ID
10 uuid: Uuid,
11 /// List of member media IDs
12 media_list: Vec<Option<Uuid>>,
13 }
14
15 impl MediaSet {
16
17 pub const MEDIA_SET_MAX_SEQ_NR: u64 = 100;
18
19 pub fn new() -> Self {
20 let uuid = Uuid::generate();
21 Self {
22 uuid,
23 media_list: Vec::new(),
24 }
25 }
26
27 pub fn with_data(uuid: Uuid, media_list: Vec<Option<Uuid>>) -> Self {
28 Self { uuid, media_list }
29 }
30
31 pub fn uuid(&self) -> &Uuid {
32 &self.uuid
33 }
34
35 pub fn media_list(&self) -> &[Option<Uuid>] {
36 &self.media_list
37 }
38
39 pub fn add_media(&mut self, uuid: Uuid) {
40 self.media_list.push(Some(uuid));
41 }
42
43 pub fn insert_media(&mut self, uuid: Uuid, seq_nr: u64) -> Result<(), Error> {
44 if seq_nr > Self::MEDIA_SET_MAX_SEQ_NR {
45 bail!("media set sequence number to large in media set {} ({} > {})",
46 self.uuid.to_string(), seq_nr, Self::MEDIA_SET_MAX_SEQ_NR);
47 }
48 let seq_nr = seq_nr as usize;
49 if self.media_list.len() > seq_nr {
50 if self.media_list[seq_nr].is_some() {
51 bail!("found duplicate sequence number in media set '{}/{}'",
52 self.uuid.to_string(), seq_nr);
53 }
54 } else {
55 self.media_list.resize(seq_nr + 1, None);
56 }
57 self.media_list[seq_nr] = Some(uuid);
58 Ok(())
59 }
60
61 pub fn last_media_uuid(&self) -> Option<&Uuid> {
62 match self.media_list.last() {
63 None => None,
64 Some(None) => None,
65 Some(Some(ref last_uuid)) => Some(last_uuid),
66 }
67 }
68
69 pub fn is_last_media(&self, uuid: &Uuid) -> bool {
70 match self.media_list.last() {
71 None => false,
72 Some(None) => false,
73 Some(Some(last_uuid)) => uuid == last_uuid,
74 }
75 }
76 }