9 个版本 (破坏性更新)
0.7.0 | 2023年9月7日 |
---|---|
0.6.0 | 2023年6月11日 |
0.5.0 | 2023年6月5日 |
0.4.0 | 2023年6月3日 |
0.1.0 | 2023年5月31日 |
#116 in 金融
180KB
3.5K SLoC
ledger-rs-lib
Ledger-cli 功能在 Rust 中实现
从零开始全新尝试 Ledger
[早期开发中!]
简介
此库旨在实现类似 Ledger-cli、Hledger、Beancount 等工具的纯文本会计原则。开发基础是 Ledger-cli,从中应用了底层模型和概念。
是 Rusty Ledger 项目的组成部分。
当前状态
虽然仍处于早期开发阶段,但基本功能已经实现。可以解析简单的 Ledger 日志文件中的交易。基本功能允许检索解析实体(交易、分录、账户、成本、金额),这可以提供非常基本的报告。
现在将扩展功能。将通过仓库中的工作项(问题)跟踪方向。
欢迎任何形式的贡献,从使用库和提供反馈,到参与讨论和提交实现和改进的 pull request。
背景
在尝试重新编写 Ledger(部分)的几次尝试之后,以下结论似乎已经明朗化
-
一个包 在尝试创建仅解析器的过程中,很明显没有必要将解析器与其他应用程序部分(模型、报告)分开。它们可以存在于同一个包中。解析器仍然可以独立于其他功能使用。从开始就更容易将模型和报告包含在同一个包中。如果需要,可以将其分开。
-
干净的 Rust 尝试将 C++ 结构转换为 Rust 并没有太多意义。原始 Ledger 中的指针算术在 Rust 中几乎无法创建和维护。引用和生命周期使 Rust 中的开发成为噩梦。应该从零开始,应用惯用的 Rust 概念。
-
最小化 Ledger 真的包含了很多功能。从最小化工作版本开始,然后扩展。
-
定义清晰的目标 尝试重写整个应用程序似乎是一项永远无法完成的任务。相反,定义清晰、小而可实现的目标,并实现它们。
目标
初始需求之外的额外目标,它们作为概念验证服务,将在源仓库中的问题中跟踪。
初始功能需求
直接目标是
- 解析最小化工作交易样本
- 创建最小化工作报告
- 账户
- 余额
- 编译一个可工作的WASM版本
- 与JavaScript交互
- 在控制台中运行
这些应该能提供对Ledger内部工作原理和概念的初步了解。
非功能性需求
- 快速执行
- 测试覆盖率
实验目标
- 永久存储(sqlite?)作为报告层的基础
WASM/WASI
WASI
要编译为Wasm以在WASI中执行,请运行
cargo build --target wasm32-wasi
然后进入 target/wasm32-wasi/debug
文件夹并运行
wasmer run --dir tests target/wasm32-wasi/debug/ledger-rs-lib.wasm -- -f tests/minimal.ledger
这将运行CLI的main()方法。在WASI中,必须显式地赋予文件系统访问权限。这通过 --dir
参数完成。请注意,Wasmer使用 --
来分隔应用程序选项,如 -f
。
您需要安装先决条件 - 编译目标(wasm32-wasi)和Wasm运行时(例如wasmer)。
WASM
该库可以编译为WASM,用于在Web应用程序中使用。
cargo install wasm-pack
wasm-pack build --target web
演示
文件夹 wwwroot
包含使用wasm的代码。使用Web服务器提供服务。例如,使用Deno的文件服务器
deno install --allow-net --allow-read https://deno.land/std/http/file_server.ts
file_server wwwroot
将deno插件位置添加到路径中。
文档
- Ledger开发者指南
- 账本格式
- Ledger源代码 repo
账本格式
我将尝试在语法图中记录Ledger的Journal格式。这是扩展巴科斯-诺尔范式(EBNF)图源。
Ledger文档中的原始规范
交易标题
DATE[=EDATE] [*|!] [(CODE)] DESC
过账
ACCOUNT AMOUNT [; NOTE]
价格
P DATE SYMBOL PRICE
批
商品的价格存储在商品注释(amount.h
)中。
annotate_commodity(amount_tprice, [datetime_tdate,string tag])
依赖关系
~6.5–9.5MB
~160K SLoC