#todo #macro #timestamp #编译时 #Unix 时间戳 #todo-or-die

todo2

受 todo_or_die 启发的增强型 todo 宏

4 个版本

0.1.3 2023 年 9 月 27 日
0.1.2 2023 年 9 月 22 日
0.1.1 2023 年 9 月 22 日
0.1.0 2023 年 9 月 22 日

#1100 in 开发工具

MIT 或 Unlicense

44KB
579

todo2

todo2(又称 todo 或 die)- 一个更好的 todo! 宏,灵感来源于 searls/todo_or_die

crates.io docs.rs downloads license

此软件包提供了一个更好的 todo! 宏,允许您指定代码应该实现的时间表和条件。当条件或时间表满足时,代码将崩溃或发出编译错误,或仅记录错误。

注意:此软件包仍在早期开发阶段,因此可能存在一些错误,API 可能在未来发生变化。如果您有任何建议或发现错误,请提出问题或发起拉取请求。

使用方法

将以下内容添加到您的 Cargo.toml

[dependencies]
todo2 = "0.1.0"

或者直接运行此命令

cargo add todo2
#[macro_use]
extern crate todo2;

fn main() {
  todo!("Hack NASA", by: 2024-3-26 at 9:00);
  get_a_hot_gf(true)
}

fn get_a_hot_gf(single: bool) {
 todo!("Get a hot girlfriend", if: single);
}

功能

  • log - 仅记录错误而不是崩溃或发出编译错误,这在严重项目中可能很有用,此功能尊重您已将 log 软件包添加到依赖项中
  • compile-error - 发出编译错误而不是崩溃。
  • with-chrono - 启用 chrono,这使您可以使用 chrono::Utcchrono::DateTime 类型来指定 by 条件的截止日期。尚未实现。
  • with-time - 启用 time,这使您可以使用 time::OffsetDateTime 类型或 time::macros::datetime 宏来指定 by 条件的截止日期。尚未实现。
  • and-time - 允许您在 by 条件中指定一天中的特定时间
  • original-compatibility - 允许您在使用此宏时无需传递任何参数,或者仅传递消息。
  • strict-syntax - 启用严格语法,强制您在消息后放置逗号或分号。
  • chrono-backend - 使用 chrono 作为 by 条件计算 UNIX 时间戳的后端,而不是默认实现。如果我在依赖项中启用此功能,因为它比默认实现更准确。 了解更多
  • time-backend - 使用 time 作为 by 条件计算 UNIX 时间戳的后端,而不是默认实现。如果我在依赖项中启用此功能,因为它比默认实现更准确。 了解更多
  • am-cool - 表示你很酷。我爱你。

默认功能包括:original-compatibilitystrict-syntaxand-timetime-backend

示例

使用 log 功能

您必须在您的 Cargo.toml 中启用 log 功能

[dependencies]
# You also have to add the `log` crate to your dependencies
log = "0.4.20"
# Use any implementation you want for the logging, in this example, I will use the `simple_logger` crate
simple_logger = "4.2.0"
# and of course, our beloved `todo2` crate
todo2 = { version = "0.1.0", features = ["log"] }
#[macro_use]
extern crate todo2;
#[macro_use]
extern crate log;

use simple_logger::SimpleLogger;

fn main() {
    // Initialize the logger
    SimpleLogger::new().init().unwrap();

    todo!("Make a cool crate", by: 2024-02-02)
}

当达到截止日期时,将记录如下错误

2024-02-02T17:27:07.013874956Z ERROR [logging_example] src/main.rs:9: Make a cool crate

请注意,您不能同时启用 compile-error 功能和 log 功能。一次只能启用其中之一。

使用 compile-error 功能

首先,将 crate 添加到您的 Cargo.toml 并启用 compile-error 功能

cargo add todo2 --features compile-error
#[macro_use]
extern crate todo2;

fn main() {
   todo!("Remove this secret", by: 2024-02-23);
   let my_little_secret = "very secret";
}

这将产生如下编译错误,当尝试以发布模式编译代码时。

by 条件中的时间

默认情况下,by 条件接受一个原始日期,并使用我们的自定义解析器解析它,该解析器期望日期格式为 YYYY-MM-DD 格式,或者如果启用了 and-time 功能,则为 YYYY-MM-DD at HH:MMYYYY-MM-DD @ HH:MM 格式。然后它将在 UTC 中计算 UNIX 时间戳,并将其与当前时间戳进行比较。

关于解析部分,这里不感兴趣。只是宏的魔法。复杂性出现在我们想要从解析的日期计算 UNIX 时间戳时。在这里,时区和夏令时以及闰秒开始发挥作用。我不愿意处理这种复杂性,因为我懒惰,这是一个“进程宏”,而不是普通crate,这意味着它在编译时运行,我们都知道 Rust 的编译时间“很快” :) 我不想让它变慢。所以我实现了一个简单的算法来计算 UNIX 时间戳,它不够准确,但可以工作。嗯,有点。

后端

这就是为什么我们有了 chrono-backendtime-backend 功能,使用 chronotime crate 来计算 UNIX 时间戳,而不是默认实现。

如果您对添加更多依赖到项目依赖树没有问题,或者您已经在依赖中拥有其中之一,我鼓励您启用它们之一。至少直到我们有更好的默认后端实现。

后端不会影响解析部分或语法,它只影响Unix时间戳的计算,这是内部事务,所以从这个角度来看,您不必担心。

也许吧?

以下是一些我可能在未来的版本中实现的想法。

  • 实现with-chrono功能,使用户能够使用chrono::Utcchrono::DateTime类型来指定by条件的截止日期,而不是原始日期。示例
todo!("Make a cool crate", by: chrono::Utc.with_ymd_and_hms(2024, 02, 02, 9, 0, 0));
todo!("Make a cool crate", by: time::macros::datetime!(2024-02-02 09:00:00));
  • 使if条件解析器能够在编译时评估一些条件,这样我们就可以使用compile-error功能与if条件。示例
   todo!("Remove this secret", if: !cfg!(debug_assertions));
   let my_little_secret = "i love you";

贡献

我很乐意接受任何贡献,但首先请考虑阅读CONTRIBUTING.md指南,以避免在我们的一些不必要的事情上浪费时间。

主要关键字包括:签名提交约定提交无表情符号PR通常不应超过三个提交

许可证

本项目的许可证为MIT许可证。更多信息请参阅LICENSE。如果您愿意,也可以在Unlicense许可证下使用。更多信息请参阅LICENSE-UNLICENSE

依赖

~19–530KB