1use std::error;
2use std::fmt;
3use std::io::Error as ioError;
4
5#[derive(Debug)]
6pub enum ProfError {
8 RegexError,
9 InvalidProfiler,
10 InvalidBinary,
11 InvalidNum,
12 InvalidSortMetric,
13 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}