1#[cfg(unix)]
2type RawFd = std::os::unix::io::RawFd;
3#[cfg(not(unix))]
4type RawFd = std::convert::Infallible;
5
6#[derive(Debug)]
10pub struct FromEnvError {
11 pub(crate) inner: FromEnvErrorInner,
12}
13
14#[derive(Debug)]
18#[non_exhaustive]
19pub enum FromEnvErrorKind {
20 NoEnvVar,
22 NoJobserver,
25 CannotParse,
27 CannotOpenPath,
29 CannotOpenFd,
31 NegativeFd,
35 NotAPipe,
37 Unsupported,
39}
40
41impl FromEnvError {
42 pub fn kind(&self) -> FromEnvErrorKind {
44 match self.inner {
45 FromEnvErrorInner::NoEnvVar => FromEnvErrorKind::NoEnvVar,
46 FromEnvErrorInner::NoJobserver => FromEnvErrorKind::NoJobserver,
47 FromEnvErrorInner::CannotParse(_) => FromEnvErrorKind::CannotParse,
48 FromEnvErrorInner::CannotOpenPath(..) => FromEnvErrorKind::CannotOpenPath,
49 FromEnvErrorInner::CannotOpenFd(..) => FromEnvErrorKind::CannotOpenFd,
50 FromEnvErrorInner::NegativeFd(..) => FromEnvErrorKind::NegativeFd,
51 FromEnvErrorInner::NotAPipe(..) => FromEnvErrorKind::NotAPipe,
52 FromEnvErrorInner::Unsupported => FromEnvErrorKind::Unsupported,
53 }
54 }
55}
56
57impl std::fmt::Display for FromEnvError {
58 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
59 match &self.inner {
60 FromEnvErrorInner::NoEnvVar => write!(f, "there is no environment variable that describes jobserver to inherit"),
61 FromEnvErrorInner::NoJobserver => write!(f, "there is no `--jobserver-fds=` or `--jobserver-auth=` in the environment variable"),
62 FromEnvErrorInner::CannotParse(s) => write!(f, "cannot parse jobserver environment variable value: {s}"),
63 FromEnvErrorInner::CannotOpenPath(s, err) => write!(f, "cannot open path or name {s} from the jobserver environment variable value: {err}"),
64 FromEnvErrorInner::CannotOpenFd(fd, err) => write!(f, "cannot open file descriptor {fd} from the jobserver environment variable value: {err}"),
65 FromEnvErrorInner::NegativeFd(fd) => write!(f, "file descriptor {fd} from the jobserver environment variable value is negative"),
66 FromEnvErrorInner::NotAPipe(fd, None) => write!(f, "file descriptor {fd} from the jobserver environment variable value is not a pipe"),
67 FromEnvErrorInner::NotAPipe(fd, Some(err)) => write!(f, "file descriptor {fd} from the jobserver environment variable value is not a pipe: {err}"),
68 FromEnvErrorInner::Unsupported => write!(f, "jobserver inheritance is not supported on this platform"),
69 }
70 }
71}
72impl std::error::Error for FromEnvError {
73 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
74 match &self.inner {
75 FromEnvErrorInner::CannotOpenPath(_, err) => Some(err),
76 FromEnvErrorInner::NotAPipe(_, Some(err)) | FromEnvErrorInner::CannotOpenFd(_, err) => {
77 Some(err)
78 }
79 _ => None,
80 }
81 }
82}
83
84#[allow(dead_code)]
85#[derive(Debug)]
86pub(crate) enum FromEnvErrorInner {
87 NoEnvVar,
88 NoJobserver,
89 CannotParse(String),
90 CannotOpenPath(String, std::io::Error),
91 CannotOpenFd(RawFd, std::io::Error),
92 NegativeFd(RawFd),
93 NotAPipe(RawFd, Option<std::io::Error>),
94 Unsupported,
95}