#nightly #macro #log-error #termination #proc-macro #wraps #fn

log-termination

一个proc宏,它将fn main()封装在一个Termination新类型中,并将错误发送到log::error!

1 个不稳定版本

0.1.0 2019年12月17日

#11 in #termination

AGPL-3.0

16KB
166

log-termination

为您的 fn main() -> Result<(), Box<dyn Error>> 提供 proc宏属性,该属性将返回的错误发送到 log::error!

#![feature(try_trait)]
#![feature(termination_trait_lib)]

use log_termination::log_termination;

#[log_termination]
fn main() -> Result<(), Box<dyn std::error::Error>> {
  // set up logging, e.g. fern

  std::fs::metadata("non-existing-file")?;
  // will call log::error!("No such file or directory (os error 2)") before exiting
}

lib.rs:

这个属性proc宏应该应用于形式为 main() -> Result<(), Box<dyn Error>> 的main函数;它将返回值封装在一个实现 Termination 的新类型中,并通过 error! 显示返回的错误。此宏纯粹是为了方便。

您的项目需要 try_traittermination_trait_lib 功能。

例如

#![feature(try_trait)]
#![feature(termination_trait_lib)]

use std::error::Error;
use std::io::ErrorKind;

#[macro_use]
extern crate log;
extern crate fern;

extern crate log_termination;
use log_termination::log_termination;

#[log_termination]
fn main() -> Result<(), Box<dyn Error>> {
  fern::Dispatch::new()
    .format(|o, m, r| { o.finish(format_args!(
      "[{}:{}] {} {}: {}",
      r.file().unwrap(),
      r.line().unwrap(),
      chrono::Local::now().format("%F %T"),
      r.level(),
      m
    ))})
    .level(log::LevelFilter::Error)
    .chain(std::io::stderr())
    .apply()?;

  return Err(Box::new(std::io::Error::new(ErrorKind::Other, "SNAFU")));

  // This code is valid, but unreachable:
  //Ok(())
}

依赖关系

~3.5–5MB
~98K SLoC