6 个版本

0.2.2 2023年3月7日
0.2.1 2023年3月5日
0.1.2 2023年3月5日

#586 in 文件系统

每月 35 次下载
用于 binroots-proc-macros

Apache-2.0

52KB
1K SLoC

binroots   版本 下载 文档 许可 Liberapay

Binroots 是一个(跨平台!)crate,它提供了一种简单高效的方法将 Rust 数据结构保存到磁盘。它允许您将结构体或枚举变体的每个字段保存为单独的文件,这使得存储响应性数据变得容易,允许最终用户和黑客监视单个文件的变化,并自动化应用程序的命令行工具。

项目状态

编写这个 crate 的初始提交花费了我大约 7 个小时。还没有单元测试,并且需要 nightly Rust。如果你在乎你的代码,请不要在生产环境中使用它(目前还不行!)我无法保证你的文件将保持安全。如果你对 binroots 的发展感兴趣,请查看 计划中的功能 并关注我的 Twitter(不保证你会在那里看到什么)

安装

使用 cargo add binroots 将其添加到你的项目中

设置一个结构体

要保存结构体,请使用 #[binroots_struct] 进行注释

use binroots::binroots_struct;

#[binroots_struct]
struct Status {
    connections: usize,
    is_online: bool,
    activity: Activity,
}

#[binroots_struct] 自动推导出 DebugDefaultserde::Serialize。它将每个字段包装在 BinrootsField 中,这使得可以在不序列化整个结构的情况下保存单个字段。

设置枚举类型

在上面的结构体中,我们使用了一个名为 Activity 的枚举类型。以下是它的定义方式

use binroots::binroots_enum;

#[binroots_enum]
enum Activity {
    None, // <- Automatically chosen as the default value
    Playing(String),
}

#[binroots_enum] 也自动推导出 DebugDefaultserde::Serialize。不需要包装类型。

为了满足 Default 的要求,它还选择了第一个变体,其名称为 NoneNothingDefaultEmpty。如果希望使用不同的默认类型,则可以使用 #[binroots_enum(manual)] 来注释枚举,并使用 #[default] 标记单元变体。

保存数据

在这个例子中,我们使用 Status::default(由 #[binroots_struct] 生成)初始化 status

当保存带有 #[binroots_struct] 注释的结构体时,它将保存到以结构体命名的子文件夹中,文件夹名称为小写短横线命名法。在这个例子中,在 Unix 上,它保存到 /tmp/<crate name>/status,在 Windows 上则保存到 %LOCALAPPDATA\<crate name>\cache\status

use binroots::save::{RootType, SaveError};

fn main() -> Result<(), SaveError> {
    let mut status = Status::default();

    *status.is_online = true;
    status.save()?; // <- Saves the entire struct to the disk

    *status.activity = Activity::Playing("video gamb".into());
    status.activity.save(Status::ROOT_FOLDER, RootType::InMemory)?; // <- Only saves status.activity to the disk

    Ok(())
}

保存后,status 文件夹应该如下所示


/tmp/binroots/status
├── activity           => "Playing"
├── activity.value     => "video gamb"
├── connections        => "0"
└── is_online          => "true"

计划功能

我可能会按此顺序添加这些功能。如果它不在列表中,那么它要么已经实现,要么未被考虑。

  • 在 Windows 上使用内存存储时,设置 hFile = INVALID_HANDLE_VALUE。目前只能在 Windows 上保存到持久存储。
  • 单元测试哈哈哈
  • 支持联合体
  • #[binroots_*] 宏统一到一个 #[binroots] 宏中
  • Self::enable_autosave(self) -> Self 用于响应式数据
  • 反序列化
  • 发送 + 同步
  • BinrootsField::watch(Fn(T)) 用于类似套接字的行为
  • Self::enable_rx(self) -> Self 用于真正的双向响应式数据
  • 异步支持?
  • 双免费/商业许可证

依赖项

~2.5MB
~51K SLoC