133d722a9Sopenharmony_ciuse crate::cfg::CFG; 233d722a9Sopenharmony_ciuse crate::gen::fs; 333d722a9Sopenharmony_ciuse std::error::Error as StdError; 433d722a9Sopenharmony_ciuse std::ffi::OsString; 533d722a9Sopenharmony_ciuse std::fmt::{self, Display}; 633d722a9Sopenharmony_ciuse std::path::Path; 733d722a9Sopenharmony_ci 833d722a9Sopenharmony_cipub(super) type Result<T, E = Error> = std::result::Result<T, E>; 933d722a9Sopenharmony_ci 1033d722a9Sopenharmony_ci#[derive(Debug)] 1133d722a9Sopenharmony_cipub(super) enum Error { 1233d722a9Sopenharmony_ci NoEnv(OsString), 1333d722a9Sopenharmony_ci Fs(fs::Error), 1433d722a9Sopenharmony_ci ExportedDirNotAbsolute(&'static Path), 1533d722a9Sopenharmony_ci ExportedEmptyPrefix, 1633d722a9Sopenharmony_ci ExportedDirsWithoutLinks, 1733d722a9Sopenharmony_ci ExportedPrefixesWithoutLinks, 1833d722a9Sopenharmony_ci ExportedLinksWithoutLinks, 1933d722a9Sopenharmony_ci UnusedExportedPrefix(&'static str), 2033d722a9Sopenharmony_ci UnusedExportedLinks(&'static str), 2133d722a9Sopenharmony_ci} 2233d722a9Sopenharmony_ci 2333d722a9Sopenharmony_cimacro_rules! expr { 2433d722a9Sopenharmony_ci ($expr:expr) => {{ 2533d722a9Sopenharmony_ci let _ = $expr; // ensure it doesn't fall out of sync with CFG definition 2633d722a9Sopenharmony_ci stringify!($expr) 2733d722a9Sopenharmony_ci }}; 2833d722a9Sopenharmony_ci} 2933d722a9Sopenharmony_ci 3033d722a9Sopenharmony_ciconst LINKS_DOCUMENTATION: &str = 3133d722a9Sopenharmony_ci "https://doc.rust-lang.org/cargo/reference/build-scripts.html#the-links-manifest-key"; 3233d722a9Sopenharmony_ci 3333d722a9Sopenharmony_ciimpl Display for Error { 3433d722a9Sopenharmony_ci fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 3533d722a9Sopenharmony_ci match self { 3633d722a9Sopenharmony_ci Error::NoEnv(var) => { 3733d722a9Sopenharmony_ci write!(f, "missing {} environment variable", var.to_string_lossy()) 3833d722a9Sopenharmony_ci } 3933d722a9Sopenharmony_ci Error::Fs(err) => err.fmt(f), 4033d722a9Sopenharmony_ci Error::ExportedDirNotAbsolute(path) => write!( 4133d722a9Sopenharmony_ci f, 4233d722a9Sopenharmony_ci "element of {} must be absolute path, but was: {:?}", 4333d722a9Sopenharmony_ci expr!(CFG.exported_header_dirs), 4433d722a9Sopenharmony_ci path, 4533d722a9Sopenharmony_ci ), 4633d722a9Sopenharmony_ci Error::ExportedEmptyPrefix => write!( 4733d722a9Sopenharmony_ci f, 4833d722a9Sopenharmony_ci "element of {} must not be empty string", 4933d722a9Sopenharmony_ci expr!(CFG.exported_header_prefixes), 5033d722a9Sopenharmony_ci ), 5133d722a9Sopenharmony_ci Error::ExportedDirsWithoutLinks => write!( 5233d722a9Sopenharmony_ci f, 5333d722a9Sopenharmony_ci "if {} is nonempty then `links` needs to be set in Cargo.toml; see {}", 5433d722a9Sopenharmony_ci expr!(CFG.exported_header_dirs), 5533d722a9Sopenharmony_ci LINKS_DOCUMENTATION, 5633d722a9Sopenharmony_ci ), 5733d722a9Sopenharmony_ci Error::ExportedPrefixesWithoutLinks => write!( 5833d722a9Sopenharmony_ci f, 5933d722a9Sopenharmony_ci "if {} is nonempty then `links` needs to be set in Cargo.toml; see {}", 6033d722a9Sopenharmony_ci expr!(CFG.exported_header_prefixes), 6133d722a9Sopenharmony_ci LINKS_DOCUMENTATION, 6233d722a9Sopenharmony_ci ), 6333d722a9Sopenharmony_ci Error::ExportedLinksWithoutLinks => write!( 6433d722a9Sopenharmony_ci f, 6533d722a9Sopenharmony_ci "if {} is nonempty then `links` needs to be set in Cargo.toml; see {}", 6633d722a9Sopenharmony_ci expr!(CFG.exported_header_links), 6733d722a9Sopenharmony_ci LINKS_DOCUMENTATION, 6833d722a9Sopenharmony_ci ), 6933d722a9Sopenharmony_ci Error::UnusedExportedPrefix(unused) => write!( 7033d722a9Sopenharmony_ci f, 7133d722a9Sopenharmony_ci "unused element in {}: {:?} does not match the include prefix of any direct dependency", 7233d722a9Sopenharmony_ci expr!(CFG.exported_header_prefixes), 7333d722a9Sopenharmony_ci unused, 7433d722a9Sopenharmony_ci ), 7533d722a9Sopenharmony_ci Error::UnusedExportedLinks(unused) => write!( 7633d722a9Sopenharmony_ci f, 7733d722a9Sopenharmony_ci "unused element in {}: {:?} does not match the `links` attribute any direct dependency", 7833d722a9Sopenharmony_ci expr!(CFG.exported_header_links), 7933d722a9Sopenharmony_ci unused, 8033d722a9Sopenharmony_ci ), 8133d722a9Sopenharmony_ci } 8233d722a9Sopenharmony_ci } 8333d722a9Sopenharmony_ci} 8433d722a9Sopenharmony_ci 8533d722a9Sopenharmony_ciimpl StdError for Error { 8633d722a9Sopenharmony_ci fn source(&self) -> Option<&(dyn StdError + 'static)> { 8733d722a9Sopenharmony_ci match self { 8833d722a9Sopenharmony_ci Error::Fs(err) => err.source(), 8933d722a9Sopenharmony_ci _ => None, 9033d722a9Sopenharmony_ci } 9133d722a9Sopenharmony_ci } 9233d722a9Sopenharmony_ci} 9333d722a9Sopenharmony_ci 9433d722a9Sopenharmony_ciimpl From<fs::Error> for Error { 9533d722a9Sopenharmony_ci fn from(err: fs::Error) -> Self { 9633d722a9Sopenharmony_ci Error::Fs(err) 9733d722a9Sopenharmony_ci } 9833d722a9Sopenharmony_ci} 99