#plain-text-accounting #wasm #library

bin+lib ledger-rs-lib

Rust 实现的 Ledger

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 金融

AGPL-3.0

180KB
3.5K SLoC

ledger-rs-lib

Ledger-cli 功能在 Rust 中实现

从零开始全新尝试 Ledger

[早期开发中!]

简介

此库旨在实现类似 Ledger-cli、Hledger、Beancount 等工具的纯文本会计原则。开发基础是 Ledger-cli,从中应用了底层模型和概念。

Rusty Ledger 项目的组成部分。

当前状态

虽然仍处于早期开发阶段,但基本功能已经实现。可以解析简单的 Ledger 日志文件中的交易。基本功能允许检索解析实体(交易、分录、账户、成本、金额),这可以提供非常基本的报告。

现在将扩展功能。将通过仓库中的工作项(问题)跟踪方向。

欢迎任何形式的贡献,从使用库和提供反馈,到参与讨论和提交实现和改进的 pull request。

背景

在尝试重新编写 Ledger(部分)的几次尝试之后,以下结论似乎已经明朗化

  1. 一个包 在尝试创建仅解析器的过程中,很明显没有必要将解析器与其他应用程序部分(模型、报告)分开。它们可以存在于同一个包中。解析器仍然可以独立于其他功能使用。从开始就更容易将模型和报告包含在同一个包中。如果需要,可以将其分开。

  2. 干净的 Rust 尝试将 C++ 结构转换为 Rust 并没有太多意义。原始 Ledger 中的指针算术在 Rust 中几乎无法创建和维护。引用和生命周期使 Rust 中的开发成为噩梦。应该从零开始,应用惯用的 Rust 概念。

  3. 最小化 Ledger 真的包含了很多功能。从最小化工作版本开始,然后扩展。

  4. 定义清晰的目标 尝试重写整个应用程序似乎是一项永远无法完成的任务。相反,定义清晰、小而可实现的目标,并实现它们。

目标

初始需求之外的额外目标,它们作为概念验证服务,将在源仓库中的问题中跟踪。

初始功能需求

直接目标是

  • 解析最小化工作交易样本
  • 创建最小化工作报告
    • 账户
    • 余额
  • 编译一个可工作的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的Journal格式。这是扩展巴科斯-诺尔范式(EBNF)图源。

diagram

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