1use glob::{GlobError, PatternError};
2use std::ffi::OsString;
3use std::fmt::{self, Display};
4use std::io;
5use std::path::PathBuf;
6
7#[derive(Debug)]
8pub enum Error {
9 Cargo(io::Error),
10 CargoFail,
11 GetManifest(PathBuf, Box<Error>),
12 Glob(GlobError),
13 Io(io::Error),
14 Metadata(serde_json::Error),
15 Mismatch,
16 NoWorkspaceManifest,
17 Open(PathBuf, io::Error),
18 Pattern(PatternError),
19 ProjectDir,
20 ReadStderr(io::Error),
21 RunFailed,
22 ShouldNotHaveCompiled,
23 Toml(basic_toml::Error),
24 UpdateVar(OsString),
25 WriteStderr(io::Error),
26}
27
28pub type Result<T> = std::result::Result<T, Error>;
29
30impl Display for Error {
31 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
32 use self::Error::*;
33
34 match self {
35 Cargo(e) => write!(f, "failed to execute cargo: {}", e),
36 CargoFail => write!(f, "cargo reported an error"),
37 GetManifest(path, e) => write!(f, "failed to read manifest {}: {}", path.display(), e),
38 Glob(e) => write!(f, "{}", e),
39 Io(e) => write!(f, "{}", e),
40 Metadata(e) => write!(f, "failed to read cargo metadata: {}", e),
41 Mismatch => write!(f, "compiler error does not match expected error"),
42 NoWorkspaceManifest => write!(f, "Cargo.toml uses edition.workspace=true, but no edition found in workspace's manifest"),
43 Open(path, e) => write!(f, "{}: {}", path.display(), e),
44 Pattern(e) => write!(f, "{}", e),
45 ProjectDir => write!(f, "failed to determine name of project dir"),
46 ReadStderr(e) => write!(f, "failed to read stderr file: {}", e),
47 RunFailed => write!(f, "execution of the test case was unsuccessful"),
48 ShouldNotHaveCompiled => {
49 write!(f, "expected test case to fail to compile, but it succeeded")
50 }
51 Toml(e) => write!(f, "{}", e),
52 UpdateVar(var) => write!(
53 f,
54 "unrecognized value of TRYBUILD: {:?}",
55 var.to_string_lossy(),
56 ),
57 WriteStderr(e) => write!(f, "failed to write stderr file: {}", e),
58 }
59 }
60}
61
62impl Error {
63 pub fn already_printed(&self) -> bool {
64 use self::Error::*;
65
66 matches!(
67 self,
68 CargoFail | Mismatch | RunFailed | ShouldNotHaveCompiled
69 )
70 }
71}
72
73impl From<GlobError> for Error {
74 fn from(err: GlobError) -> Self {
75 Error::Glob(err)
76 }
77}
78
79impl From<PatternError> for Error {
80 fn from(err: PatternError) -> Self {
81 Error::Pattern(err)
82 }
83}
84
85impl From<io::Error> for Error {
86 fn from(err: io::Error) -> Self {
87 Error::Io(err)
88 }
89}
90
91impl From<basic_toml::Error> for Error {
92 fn from(err: basic_toml::Error) -> Self {
93 Error::Toml(err)
94 }
95}
96