1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 use std::error; 6 use std::fmt; 7 8 pub use crate::bindgen::cargo::cargo_expand::Error as CargoExpandError; 9 pub use crate::bindgen::cargo::cargo_metadata::Error as CargoMetadataError; 10 pub use crate::bindgen::cargo::cargo_toml::Error as CargoTomlError; 11 pub use syn::parse::Error as ParseError; 12 13 #[derive(Debug)] 14 #[allow(clippy::enum_variant_names)] 15 pub enum Error { 16 CargoMetadata(String, CargoMetadataError), 17 CargoToml(String, CargoTomlError), 18 CargoExpand(String, CargoExpandError), 19 ParseSyntaxError { 20 crate_name: String, 21 src_path: String, 22 error: ParseError, 23 }, 24 ParseCannotOpenFile { 25 crate_name: String, 26 src_path: String, 27 }, 28 } 29 30 impl fmt::Display for Error { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result31 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 32 match *self { 33 Error::CargoMetadata(ref path, ref error) => write!( 34 f, 35 "Couldn't execute `cargo metadata` with manifest {:?}: {:?}", 36 path, error 37 ), 38 Error::CargoToml(ref path, ref error) => { 39 write!(f, "Couldn't load manifest file {:?}: {:?}", path, error) 40 } 41 Error::CargoExpand(ref crate_name, ref error) => write!( 42 f, 43 "Parsing crate `{}`: couldn't run `cargo rustc -Zunpretty=expanded`: {:?}", 44 crate_name, error 45 ), 46 Error::ParseSyntaxError { 47 ref crate_name, 48 ref src_path, 49 ref error, 50 } => { 51 write!( 52 f, 53 "Parsing crate `{}`:`{}`:\n{:?}", 54 crate_name, src_path, error 55 )?; 56 57 if !src_path.is_empty() { 58 write!( 59 f, 60 "\nTry running `rustc -Z parse-only {}` to see a nicer error message", 61 src_path, 62 )? 63 } 64 Ok(()) 65 } 66 Error::ParseCannotOpenFile { 67 ref crate_name, 68 ref src_path, 69 } => write!( 70 f, 71 "Parsing crate `{}`: cannot open file `{}`.", 72 crate_name, src_path 73 ), 74 } 75 } 76 } 77 78 impl error::Error for Error { source(&self) -> Option<&(dyn error::Error + 'static)>79 fn source(&self) -> Option<&(dyn error::Error + 'static)> { 80 match self { 81 Error::CargoMetadata(_, ref error) => Some(error), 82 Error::CargoToml(_, ref error) => Some(error), 83 Error::CargoExpand(_, ref error) => Some(error), 84 Error::ParseSyntaxError { ref error, .. } => Some(error), 85 Error::ParseCannotOpenFile { .. } => None, 86 } 87 } 88 } 89