1use crate::blkx::BlkxTable;
2use anyhow::Result;
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, Default, Deserialize, Serialize)]
6#[serde(deny_unknown_fields)]
7pub struct Plist {
8 #[serde(rename = "resource-fork")]
9 pub resource_fork: ResourceFork,
10}
11
12impl Plist {
13 pub fn partitions(&self) -> &[Partition] {
14 &self.resource_fork.blkx
15 }
16
17 pub fn add_partition(&mut self, partition: Partition) {
18 self.resource_fork.blkx.push(partition);
19 }
20}
21
22#[derive(Clone, Debug, Default, Deserialize, Serialize)]
23#[serde(deny_unknown_fields)]
24pub struct ResourceFork {
25 pub blkx: Vec<Partition>,
26 #[serde(default)]
27 pub plst: Vec<Partition>,
28}
29
30#[derive(Clone, Debug, Deserialize, Serialize)]
31#[serde(deny_unknown_fields)]
32pub struct Partition {
33 #[serde(rename = "Attributes")]
34 pub attributes: String,
35 #[serde(rename = "CFName")]
36 #[serde(default)]
37 pub cfname: String,
38 #[serde(rename = "Data")]
39 #[serde(with = "serde_bytes")]
40 pub data: Vec<u8>,
41 #[serde(rename = "ID")]
42 pub id: String,
43 #[serde(rename = "Name")]
44 pub name: String,
45}
46
47impl Partition {
48 pub fn new(id: i32, name: String, table: BlkxTable) -> Self {
49 let mut data = vec![];
50 table.write_to(&mut data).unwrap();
51 Self {
52 attributes: "0x0050".to_string(),
53 cfname: name.clone(),
54 data,
55 id: id.to_string(),
56 name,
57 }
58 }
59
60 pub fn table(&self) -> Result<BlkxTable> {
61 BlkxTable::read_from(&mut &self.data[..])
62 }
63}