use std::error; use std::fmt; /// Errors that can occur during code generation. #[derive(Clone, Debug, PartialEq, Eq)] pub(crate) enum Error { /// Tried to generate an opaque blob for a type that did not have a layout. NoLayoutForOpaqueBlob, /// Tried to instantiate an opaque template definition, or a template /// definition that is too difficult for us to understand (like a partial /// template specialization). InstantiationOfOpaqueType, /// Type was a reference not a pointer, but we had nowhere to record that fact. ReferenceButCouldNotRecord, /// Function ABI is not supported. UnsupportedAbi(&'static str), /// The pointer type size does not match the target's pointer size. InvalidPointerSize { ty_name: String, ty_size: usize, ptr_size: usize, }, } impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Error::NoLayoutForOpaqueBlob => { "Tried to generate an opaque blob, but had no layout.".fmt(f) } Error::InstantiationOfOpaqueType => { "Instantiation of opaque template type or partial template specialization." .fmt(f) } Error::ReferenceButCouldNotRecord => { "Type was a reference in a context where we only expected other types".fmt(f) } Error::UnsupportedAbi(abi) => { write!( f, "{} ABI is not supported by the configured Rust target.", abi ) } Error::InvalidPointerSize { ty_name, ty_size, ptr_size } => { write!(f, "The {} pointer type has size {} but the current target's pointer size is {}.", ty_name, ty_size, ptr_size) } } } } impl error::Error for Error {} /// A `Result` of `T` or an error of `bindgen::codegen::error::Error`. pub(crate) type Result = ::std::result::Result;