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