profiler/
err.rs

1use std::error;
2use std::fmt;
3use std::io::Error as ioError;
4
5#[derive(Debug)]
6/// Represents potential errors that may occur when profiling
7pub enum ProfError {
8    RegexError,
9    InvalidProfiler,
10    InvalidBinary,
11    InvalidNum,
12    InvalidSortMetric,
13    /// Wraps a std::io::Error
14    IOError(ioError),
15    UTF8Error,
16    MisalignedData,
17    CompilationError(String, String),
18    TomlError,
19    ReadManifestError,
20    NoNameError,
21    NoTargetDirectory,
22    OutOfMemoryError,
23    CliError,
24}
25
26impl fmt::Display for ProfError {
27    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
28        match *self {
29            ProfError::RegexError => {
30                write!(f,
31                       "\x1b[1;31merror: \x1b[0mRegex error -- please file a bug. In bug report, \
32                        please include the original output file from profiler, e.g. from \
33                        valgrind --tool=cachegrind --cachegrind-out-file=cachegrind.txt")
34            }
35            ProfError::InvalidProfiler => {
36                write!(f,
37                       "\x1b[1;31merror: \x1b[0mInvalid profiler. cargo profiler currently \
38                        supports callgrind and cachegrind.")
39            }
40            ProfError::InvalidBinary => {
41                write!(f,
42                       "\x1b[1;31merror: \x1b[0mInvalid binary. make sure binary exists.")
43            }
44            ProfError::InvalidNum => {
45                write!(f,
46                       "\x1b[1;31merror: \x1b[0mInvalid number. make sure number is a positive \
47                        integer.")
48            }
49            ProfError::InvalidSortMetric => {
50                write!(f,
51                       "\x1b[1;31merror: \x1b[0mInvalid metric to sort on. available cachegrind \
52                        metrics are \nir, i1mr, ilmr, dr, d1mr, dlmr, dw, d1mw, and dlmw. Check \
53                        README for details on these metrics.")
54            }
55            ProfError::IOError(ref err) => {
56                write!(f,
57                       "\x1b[1;31merror: \x1b[0mIO error: {} -- please file a bug.",
58                       err)
59            }
60            ProfError::UTF8Error => {
61                write!(f,
62                       "\x1b[1;31merror: \x1b[0mCLI Utf8 error -- please file a bug.")
63            }
64            ProfError::MisalignedData => {
65                write!(f,
66                       "\x1b[1;31merror: \x1b[0mMisaligned data arrays due to regex error -- \
67                        please file a bug.")
68            }
69            ProfError::CompilationError(ref package_name, ref stderr) => {
70                write!(f,
71                       "\x1b[1;31merror: \x1b[0mFailed to compile {}.\n\n{}",
72                       package_name,
73                       stderr)
74            }
75            ProfError::TomlError => {
76                write!(f,
77                       "\x1b[1;31merror: \x1b[0mError in parsing Cargo.toml to derive package \
78                        name. Make sure package name is directly under [package] tag.")
79            }
80            ProfError::ReadManifestError => {
81                write!(f,
82                       "\x1b[1;31merror: \x1b[0mCargo.toml missing. Are you sure you're in a Rust \
83                        project?")
84            }
85
86            ProfError::NoNameError => {
87                write!(f,
88                       "\x1b[1;31merror: \x1b[0mNo package name found in Cargo.toml. Run \
89                        cargo read-manifest to make sure everything looks okay. Otherwise please \
90                        submit bug.")
91            }
92
93            ProfError::NoTargetDirectory => {
94                write!(f,
95                       "\x1b[1;31merror: \x1b[0mNo target output directory found in project. \
96                        Binary must be in target/debug/ or target/release/, or specify binary \
97                        path explicitly with --bin argument.")
98            }
99            ProfError::OutOfMemoryError => {
100                write!(f,
101                       "\x1b[1;31merror: \x1b[0mValgrind's memory management: out of memory. \
102                        Valgrind cannot continue. Sorry. ")
103            }
104            ProfError::CliError => {
105                write!(f,
106                       "\x1b[1;31merror: \x1b[0mError in valgrind cli call. Make sure valgrind is \
107                        installed properly.")
108            }
109        }
110    }
111}
112
113impl error::Error for ProfError {
114    fn description(&self) -> &str {
115        match *self {
116            ProfError::RegexError => "Regex error. file bug.",
117            ProfError::InvalidProfiler => "Invalid Profiler.",
118            ProfError::InvalidBinary => "Invalid Binary.",
119            ProfError::InvalidNum => "Invalid number.",
120            ProfError::InvalidSortMetric => "Invalid sort metric.",
121            ProfError::MisalignedData => "Misaligned Data. File bug.",
122            ProfError::CompilationError(_, _) => {
123                "Failed to compile. Run cargo build to get compilation error."
124            }
125            ProfError::TomlError => "Error in parsing Cargo.toml.",
126            ProfError::ReadManifestError => "Error in reading the manifest of this crate.",
127            ProfError::NoNameError => "No package name found in Cargo.toml",
128            ProfError::NoTargetDirectory => "No target output directory found in project.",
129            ProfError::IOError(ref err) => err.description(),
130            ProfError::OutOfMemoryError => "out of memory.",
131            ProfError::CliError => "make sure valgrind is installed properly.",
132            ProfError::UTF8Error => "utf8 error. file bug.",
133        }
134    }
135
136    fn cause(&self) -> Option<&error::Error> {
137        match *self {
138            ProfError::RegexError => None,
139            ProfError::InvalidProfiler => None,
140            ProfError::InvalidBinary => None,
141            ProfError::InvalidNum => None,
142            ProfError::InvalidSortMetric => None,
143            ProfError::MisalignedData => None,
144            ProfError::TomlError => None,
145            ProfError::IOError(ref err) => Some(err),
146            ProfError::CompilationError(_, _) => None,
147            ProfError::ReadManifestError => None,
148            ProfError::NoNameError => None,
149            ProfError::NoTargetDirectory => None,
150            ProfError::OutOfMemoryError => None,
151            ProfError::CliError => None,
152            ProfError::UTF8Error => None,
153        }
154    }
155}
156
157impl From<ioError> for ProfError {
158    fn from(err: ioError) -> ProfError {
159        ProfError::IOError(err)
160    }
161}