1use std::fmt;
4use std::io;
5use std::path::PathBuf;
6
7use denise::SurfaceError;
8
9use crate::info::FbInfoError;
10
11#[derive(Debug)]
13#[non_exhaustive]
14pub enum FbdevError {
15 NoDevice,
20
21 Open {
25 path: PathBuf,
27 source: io::Error,
29 },
30
31 Sysfs {
33 path: PathBuf,
35 source: io::Error,
37 },
38
39 Geometry(FbInfoError),
41
42 Map(io::Error),
44
45 TooSmall {
47 required: usize,
49 actual: usize,
51 },
52}
53
54impl fmt::Display for FbdevError {
55 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
56 match self {
57 Self::NoDevice => f.write_str("no framebuffer device found"),
58 Self::Open { path, .. } => write!(f, "opening {}", path.display()),
59 Self::Sysfs { path, .. } => write!(f, "reading {}", path.display()),
60 Self::Geometry(err) => core::fmt::Display::fmt(err, f),
61 Self::Map(_) => f.write_str("mapping the framebuffer"),
62 Self::TooSmall { required, actual } => write!(
63 f,
64 "framebuffer is {actual} bytes but the geometry needs {required}"
65 ),
66 }
67 }
68}
69
70impl std::error::Error for FbdevError {
71 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
72 match self {
73 Self::Open { source, .. } | Self::Sysfs { source, .. } | Self::Map(source) => {
74 Some(source)
75 }
76 Self::NoDevice | Self::Geometry(_) | Self::TooSmall { .. } => None,
77 }
78 }
79}
80
81impl From<FbInfoError> for FbdevError {
82 fn from(err: FbInfoError) -> Self {
83 Self::Geometry(err)
84 }
85}
86
87impl From<FbdevError> for SurfaceError {
88 fn from(err: FbdevError) -> Self {
89 SurfaceError::backend(err)
90 }
91}