diff options
Diffstat (limited to 'src/bindgen/error.rs')
-rw-r--r-- | src/bindgen/error.rs | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/bindgen/error.rs b/src/bindgen/error.rs new file mode 100644 index 0000000..e4002f6 --- /dev/null +++ b/src/bindgen/error.rs @@ -0,0 +1,88 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +use std::error; +use std::fmt; + +pub use crate::bindgen::cargo::cargo_expand::Error as CargoExpandError; +pub use crate::bindgen::cargo::cargo_metadata::Error as CargoMetadataError; +pub use crate::bindgen::cargo::cargo_toml::Error as CargoTomlError; +pub use syn::parse::Error as ParseError; + +#[derive(Debug)] +#[allow(clippy::enum_variant_names)] +pub enum Error { + CargoMetadata(String, CargoMetadataError), + CargoToml(String, CargoTomlError), + CargoExpand(String, CargoExpandError), + ParseSyntaxError { + crate_name: String, + src_path: String, + error: ParseError, + }, + ParseCannotOpenFile { + crate_name: String, + src_path: String, + }, +} + +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match *self { + Error::CargoMetadata(ref path, ref error) => write!( + f, + "Couldn't execute `cargo metadata` with manifest {:?}: {:?}", + path, error + ), + Error::CargoToml(ref path, ref error) => { + write!(f, "Couldn't load manifest file {:?}: {:?}", path, error) + } + Error::CargoExpand(ref crate_name, ref error) => write!( + f, + "Parsing crate `{}`: couldn't run `cargo rustc -Zunpretty=expanded`: {:?}", + crate_name, error + ), + Error::ParseSyntaxError { + ref crate_name, + ref src_path, + ref error, + } => { + write!( + f, + "Parsing crate `{}`:`{}`:\n{:?}", + crate_name, src_path, error + )?; + + if !src_path.is_empty() { + write!( + f, + "\nTry running `rustc -Z parse-only {}` to see a nicer error message", + src_path, + )? + } + Ok(()) + } + Error::ParseCannotOpenFile { + ref crate_name, + ref src_path, + } => write!( + f, + "Parsing crate `{}`: cannot open file `{}`.", + crate_name, src_path + ), + } + } +} + +impl error::Error for Error { + fn source(&self) -> Option<&(dyn error::Error + 'static)> { + match self { + Error::CargoMetadata(_, ref error) => Some(error), + Error::CargoToml(_, ref error) => Some(error), + Error::CargoExpand(_, ref error) => Some(error), + Error::ParseSyntaxError { ref error, .. } => Some(error), + Error::ParseCannotOpenFile { .. } => None, + } + } +} |