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
52KB
1K SLoC
binroots
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]
自动推导出 Debug
、Default
和 serde::Serialize
。它将每个字段包装在 BinrootsField
中,这使得可以在不序列化整个结构的情况下保存单个字段。
设置枚举类型
在上面的结构体中,我们使用了一个名为 Activity
的枚举类型。以下是它的定义方式
use binroots::binroots_enum;
#[binroots_enum]
enum Activity {
None, // <- Automatically chosen as the default value
Playing(String),
}
#[binroots_enum]
也自动推导出 Debug
、Default
和 serde::Serialize
。不需要包装类型。
为了满足 Default
的要求,它还选择了第一个变体,其名称为 None
、Nothing
、Default
或 Empty
。如果希望使用不同的默认类型,则可以使用 #[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