#result #path #command #options

macrofied-toolbox

此库提供了一种在 Rust 的 Result 和 Option 模式添加调试信息的舒适体验

5 个版本 (3 个破坏性更新)

0.4.2 2021 年 11 月 5 日
0.4.0 2021 年 11 月 5 日
0.3.0 2021 年 10 月 31 日
0.2.0 2021 年 10 月 25 日
0.1.0 2021 年 8 月 13 日

#64#result

每月 28 次下载
cli-toolbox 中使用

MIT 许可证

61KB
1K SLoC

macrofied-toolbox

此库提供了一种在 Rust 的 Result<T,E>Option<T> 模式添加调试信息的舒适体验

类似于类似的 cli-toolbox crate,该调试逻辑相似,这并不是一个日志替代品;它的目的是在应用程序开发期间生成调试输出。

虽然宏被设计得更加舒适,但它们包括不包含调试以提供代码一致性变体,因此您可以在项目中的整个项目中一致地使用相同的语法。

Result<T,E>

use std::fs::File;
use std::io;
use std::io::{BufWriter, Write};
use macrofied_toolbox::result;

fn main() -> io::Result<()> {
    let file_name = "foo.txt";

    // attempts to create a file
    result! {
        // * if you use the try "?" punctuation, the result! macro will
        //   still output debug or error before returning the Result::Err
        @when  File::create(file_name)?;
        // if the file is successfully created, write some content
        @ok    (file) => {
            let mut out = BufWriter::new(file);

            writeln!(out, "some content")?;
            writeln!(out, "some more content")?;
        }
        // if an exception occurs output debug message to stdout
        @debug "problem creating file: {:?} - {}", file_name, err

        // * debug messages are conditionally compiled
        //   and do not output anything in release builds
        // * "err" contains the Result::Err value and can be optionally referenced,
        //   it is discarded if it is not referenced
    }

    Ok(())
}

Option<T>

use std::fs::File;
use std::io;
use std::io::{BufWriter, Write};
use std::process::exit;

use macrofied_toolbox::option;

fn main() {
    let file_name = "foo.txt";

    if let None = example(file_name) {
        eprintln!("failed to create {:?} file!", file_name);
        exit(-1);
    }
}

fn example(file_name: &str) -> Option<()> {
    // attempts to create a file
    option! {
        // * if you use the try "?" punctuation, the result! macro will
        //   still output debug or error before returning the Result::Err
        @when  File::create(file_name).ok()?;
        // if the file is successfully created, write some content
        @some  (file) => {
            let mut out = BufWriter::new(file);

            writeln!(out, "some content").ok()?;
            writeln!(out, "some more content").ok()?;
        }
        // if an exception occurs output debug message to stdout
        @debug "problem creating file: {:?}", file_name

        // * debug messages are conditionally compiled
        //   and do not output anything in release builds
        // * "err" contains the Result::Err value and can be optionally referenced,
        //   it is discarded if it is not referenced
    }

    Some(())
}

资源

用法

每个宏都由一个功能控制;分别是 alloptionresult

  • option!
[dependencies]
macrofied-toolbox = { version = "0.4", features = ["option"] }
  • result!
[dependencies]
macrofied-toolbox = { version = "0.4", features = ["result"] }

功能

虽然 macrofied-toolbox 被设计得更加舒适,但生成调试输出由可选的 X-debug 功能控制,以实现最大灵活性。

* 调试输出仅在非优化构建中有效 *

  • all-debug - 启用控制台调试和两个功能
  • option-debug - 启用控制台调试和 option!
  • result-debug - 启用控制台调试和 result!

路线图

  • 为 Ok 和 Err 提供日志记录
  • 其他模式?

已实现

  • result! - 处理 Result<T,E> 表达式
  • option! - 处理 Option<T> 表达式
  • 支持引用/可变 Ok<T>Some<T>

依赖项

~0–380KB