| /* 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, |
| } |
| } |
| } |