#error #enums #sum #try #error-derive #macro-derive

sum_error

为快速将错误类型求和到错误枚举而提供的 derive 宏

2 个版本

0.1.2 2019 年 11 月 3 日
0.1.1 2019 年 11 月 3 日
0.1.0 2019 年 11 月 3 日

#13 in #error-derive

MIT 许可证

16KB
140

求和错误

此库旨在简化使用 try 调用(或 ? 操作符)编写的函数,并提供一个 derive 宏,以便轻松将错误求和到一个自动推导所有所需特质的枚举中,包括从所有包含的错误类型推导 std::error::Errorstd::convert::From

为了使用此功能,创建一个包含未命名变体的枚举,每个变体只有一个错误类型。然后使用 derive 宏。现在就完成了!

示例

为了更好地说明所描述的功能,请考虑以下示例。

use std::fs::File;
use std::rc::Rc;
use sprite::Sprite;
use piston_window::Texture;
use image::gif::Decoder;
use image::AnimationDecoder;
use piston_window::{TextureContext, TextureSettings};
use sum_error::*;

/// Load a gif sprite.
pub fn load<F: gfx::Factory<R>,
            R: gfx::Resources,
            C: gfx::CommandBuffer<R>>(ctx: &mut TextureContext<F, R, C>)
                -> Result<Vec<Sprite<Texture<R>>>, CombineError> {
    let file = File::open("file.gif")?;
    let decoder = Decoder::new(file)?;
    let frames = decoder.into_frames().collect_frames()?;
    frames.iter()
        .map(|frame| {
            Texture::from_image(ctx, frame.buffer(), &TextureSettings::new())
                .map(Rc::new)
                .map(Sprite::from_texture)
                .map_err(|e| e.into())
        }).collect()
}

#[derive(SumError)]
pub enum CombineError {
    FileError(std::io::Error),
    ImageError(image::ImageError),
    GfxError(gfx_texture::Error),
}

使用 SumError derive 宏允许我们有效地使用标准工具描述错误类型的求和,然后不必浪费时间编写大量 trait 的实现,以便方便地使用。

枚举的要求

  • 首先,它应该是一个枚举 -- 不是一个结构体,也不是一个联合体。枚举
  • 变体应仅包含一个未命名的字段
  • 字段类型应实现 std::error::Error
  • 字段类型应在枚举作用域内是唯一的(否则 std::convert::From trait 将无法实现)

替代方案

如果您不需要 std::error::Error 功能,请考虑使用 sum_type crate。它确实提供了轻松求和类型并实现 std::convert::From trait 的功能。然而,请注意,它不是设计成使用可爱的 derive 语法,而是使用原始宏。

贡献

请随时提出问题、要求更多功能并提出任何改进建议。您可以使用 GitHub 工具进行此操作,或者直接通过电子邮件联系作者。

作者

依赖项

~1.5MB
~35K SLoC