1use std::fmt;
2use std::io;
3
4#[derive(Debug)]
5pub enum Error {
6 Block(fs_core::Error),
9 Io(io::Error),
12 NoPartitionTable,
14 GptHeaderCrc,
16 GptEntriesCrc,
18 GptCorrupt(&'static str),
20 MbrCorrupt(&'static str),
22 GptBackupMismatch(&'static str),
27 Invalid(&'static str),
30 DeviceTooSmall,
33}
34
35impl fmt::Display for Error {
36 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37 match self {
38 Error::Block(e) => write!(f, "{e}"),
39 Error::Io(e) => write!(f, "io: {e}"),
40 Error::NoPartitionTable => write!(f, "no GPT or MBR signature found"),
41 Error::GptHeaderCrc => write!(f, "GPT header CRC32 mismatch"),
42 Error::GptEntriesCrc => write!(f, "GPT partition-entry array CRC32 mismatch"),
43 Error::GptCorrupt(s) => write!(f, "GPT corrupt: {s}"),
44 Error::MbrCorrupt(s) => write!(f, "MBR corrupt: {s}"),
45 Error::GptBackupMismatch(s) => write!(f, "GPT backup mismatch: {s}"),
46 Error::Invalid(s) => write!(f, "invalid argument: {s}"),
47 Error::DeviceTooSmall => write!(f, "device too small for the requested table"),
48 }
49 }
50}
51
52impl std::error::Error for Error {
53 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
54 match self {
55 Error::Block(e) => Some(e),
56 Error::Io(e) => Some(e),
57 _ => None,
58 }
59 }
60}
61
62impl From<io::Error> for Error {
63 fn from(e: io::Error) -> Self {
64 Error::Io(e)
65 }
66}
67
68impl From<fs_core::Error> for Error {
69 fn from(e: fs_core::Error) -> Self {
70 Error::Block(e)
71 }
72}
73
74pub type Result<T> = std::result::Result<T, Error>;