|
3 | 3 | // SPDX-License-Identifier: MPL-2.0 |
4 | 4 |
|
5 | 5 | use std::{ |
6 | | - fs, io, |
| 6 | + fmt, fs, io, |
7 | 7 | path::{Path, PathBuf}, |
8 | 8 | }; |
9 | 9 |
|
@@ -54,20 +54,76 @@ pub struct BasicDisk { |
54 | 54 | pub partitions: Vec<Partition>, |
55 | 55 | } |
56 | 56 |
|
| 57 | +impl fmt::Display for Disk { |
| 58 | + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
| 59 | + let bytes = self.size(); |
| 60 | + let gib = bytes as f64 / 1_073_741_824.0; |
| 61 | + |
| 62 | + write!(f, "{} ({:.2} GiB)", self.name(), gib)?; |
| 63 | + |
| 64 | + if let Some(vendor) = self.vendor() { |
| 65 | + write!(f, " - {}", vendor)?; |
| 66 | + } |
| 67 | + |
| 68 | + if let Some(model) = self.model() { |
| 69 | + write!(f, " {}", model)?; |
| 70 | + } |
| 71 | + |
| 72 | + Ok(()) |
| 73 | + } |
| 74 | +} |
| 75 | + |
57 | 76 | impl Disk { |
58 | 77 | /// Returns the name of the disk device. |
59 | 78 | pub fn name(&self) -> &str { |
60 | 79 | match self { |
61 | | - Disk::Scsi(disk) => disk.name(), |
62 | | - Disk::Nvme(disk) => disk.name(), |
| 80 | + Disk::Scsi(disk) => &disk.disk.name, |
| 81 | + Disk::Nvme(disk) => &disk.disk.name, |
63 | 82 | } |
64 | 83 | } |
65 | 84 |
|
66 | 85 | /// Returns the partitions on the disk. |
67 | 86 | pub fn partitions(&self) -> &[Partition] { |
68 | 87 | match self { |
69 | | - Disk::Scsi(disk) => disk.partitions(), |
70 | | - Disk::Nvme(disk) => disk.partitions(), |
| 88 | + Disk::Scsi(disk) => &disk.disk.partitions, |
| 89 | + Disk::Nvme(disk) => &disk.disk.partitions, |
| 90 | + } |
| 91 | + } |
| 92 | + |
| 93 | + /// Returns the path to the disk device in dev. |
| 94 | + pub fn device_path(&self) -> &Path { |
| 95 | + match self { |
| 96 | + Disk::Scsi(disk) => &disk.disk.device, |
| 97 | + Disk::Nvme(disk) => &disk.disk.device, |
| 98 | + } |
| 99 | + } |
| 100 | + |
| 101 | + /// Returns the total number of sectors on the disk. |
| 102 | + pub fn sectors(&self) -> u64 { |
| 103 | + match self { |
| 104 | + Disk::Scsi(disk) => disk.disk.sectors, |
| 105 | + Disk::Nvme(disk) => disk.disk.sectors, |
| 106 | + } |
| 107 | + } |
| 108 | + |
| 109 | + /// Returns the size of the disk in bytes. |
| 110 | + pub fn size(&self) -> u64 { |
| 111 | + self.sectors() * 512 |
| 112 | + } |
| 113 | + |
| 114 | + /// Returns the model name of the disk. |
| 115 | + pub fn model(&self) -> Option<&str> { |
| 116 | + match self { |
| 117 | + Disk::Scsi(disk) => disk.disk.model.as_deref(), |
| 118 | + Disk::Nvme(disk) => disk.disk.model.as_deref(), |
| 119 | + } |
| 120 | + } |
| 121 | + |
| 122 | + /// Returns the vendor name of the disk. |
| 123 | + pub fn vendor(&self) -> Option<&str> { |
| 124 | + match self { |
| 125 | + Disk::Scsi(disk) => disk.disk.vendor.as_deref(), |
| 126 | + Disk::Nvme(disk) => disk.disk.vendor.as_deref(), |
71 | 127 | } |
72 | 128 | } |
73 | 129 | } |
@@ -170,9 +226,9 @@ mod tests { |
170 | 226 | let devices = BlockDevice::discover().unwrap(); |
171 | 227 | for device in &devices { |
172 | 228 | if let BlockDevice::Disk(disk) = device { |
173 | | - println!("{}:", disk.name()); |
| 229 | + println!("{}: {disk}", disk.name()); |
174 | 230 | for partition in disk.partitions() { |
175 | | - println!("├─{}", partition.name); |
| 231 | + println!("├─{} {partition}", partition.name); |
176 | 232 | } |
177 | 233 | } |
178 | 234 | } |
|
0 commit comments