//! 把 IDF 的 `esp_err_t` 返回值变成可读的 `anyhow::Error`。 //! //! 固件里到处都要判 `ESP_OK` 并把错误码翻译成人能看懂的名字;不翻译的话现场只会 //! 看到 `0x105`,而 IDF 的错误码表并不在脑子里。 use anyhow::{anyhow, Result}; use esp_idf_svc::sys as ffi; /// `ESP_OK` 之外的返回值转成 `Err`,`what` 是出错的那一步的名字。 pub fn check(what: &str, rc: ffi::esp_err_t) -> Result<()> { if rc == ffi::ESP_OK { return Ok(()); } Err(anyhow!("{what} failed: {} (0x{rc:x})", name(rc))) } /// 错误码的名字,例如 `ESP_ERR_INVALID_ARG`。 #[must_use] pub fn name(rc: ffi::esp_err_t) -> String { // SAFETY: esp_err_to_name 对任意 esp_err_t 都返回一个静态 C 字符串。 unsafe { core::ffi::CStr::from_ptr(ffi::esp_err_to_name(rc)) .to_string_lossy() .into_owned() } }