#tauri #command #framework

anyhow-tauri

一个库,允许你在 tauri 框架中将 anyhow 用作命令结果。

1 个稳定版本

1.0.0 2024年5月30日

#33 in #tauri

MIT 许可证

9KB
100

简介

一个库,使得你可以将 anyhow 库tauri 框架 结合使用,作为命令结果。

如何使用

定义一个使用 anyhow 的函数

fn function_that_throws() -> anyhow::Result<()> {
    anyhow::bail!("Simulating a possible throw")
}

fn function_that_succeeds() -> anyhow::Result<String> {
    Ok("this function succeeds".to_string())
}

然后使用 anyhow_tauri::TAResult<T> 作为你命令的返回类型。就这样!现在,你可以像在 tauri 外部一样处理错误了!

#[tauri::command]
fn test() -> anyhow_tauri::TAResult<String> {
    Ok("No error thrown.".into())
}

#[tauri::command]
fn test_anyhow_success() -> anyhow_tauri::TAResult<String> {
    function_that_succeeds().into_ta_result()

    // could also be written as
    // Ok(function_that_succeeds()?)
}

#[tauri::command]
fn test_throw() -> anyhow_tauri::TAResult<String> {
    function_that_throws()?;

    Ok("this should never trigger".to_owned())
}

#[tauri::command]
fn test_pure_err_conversion() -> anyhow_tauri::TAResult<String> {
    let _some_empty_err = anyhow::anyhow!("some err").into_ta_empty_result();
    anyhow::anyhow!("Showcase of the .into_ta_result()").into_ta_result()
}

#[tauri::command]
fn test_bail() -> anyhow_tauri::TAResult<String> {
    anyhow_tauri::bail!("Showcase of the .bail!()")
}

#[tauri::command]
fn test_ensure() -> anyhow_tauri::TAResult<String> {
    anyhow_tauri::ensure!(1 == 2); // this should throw

    Ok("this should never trigger".to_owned())
}

注意,你可以随意使用 ? 操作符。由于我无法为它们实现适当的特性,我不得不为 bail!()ensure!() 宏创建包装器。每个类型前的 TA 代表 TauriAnyhow,因为我不想使用可能与你的代码库中的其他类型名称冲突的类型名称。整个库大约有 +-100 行代码。如果你不想依赖 另一个 包,你应该能够将其复制粘贴到你的代码库中而不会出现任何问题(我不期望这个库会有太大的变化)。

注意事项

  • 默认情况下,在生成生产版本时,禁用了将错误发送到客户端。要启用它们,请启用功能 show_errs_in_release
  • 你必须使用 anyhow_tauri::TAResult<T> 作为你命令的返回类型。这可能会对一些人造成问题。
  • 可能缺少对某些 anyhow 功能的支持,我在尝鲜时没有找到任何问题!

致谢

最初,当我在一个 Tauri 工作组办公室小时会议中询问如何将 anyhow 与 tauri 结合使用时,一位 Discord 用户(我无论如何都找不到他们 😅)建议我使用以下代码

#[derive(Debug)]
pub struct CommandError(pub anyhow::Error);

impl std::error::Error for CommandError {}

impl Serialize for CommandError {
    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
    where
        S: serde::Serializer,
    {
        serializer.serialize_str(&format!("{:#}", self.0))
    }
}

impl From<anyhow::Error> for CommandError {
    fn from(error: anyhow::Error) -> Self {
        Self(error)
    }
}

pub type Result<T> = std::result::Result<T, CommandError>;

我取了这段代码,进一步扩展了它,并添加了一些额外的功能,使得 anyhowtauri 的结合使用更加“平滑”。所以,向那位神秘的 Discord 用户致谢! :/

依赖项

~0.5–1MB
~24K SLoC