3 unstable releases
Uses new Rust 2024
| 0.1.2 | Aug 7, 2025 |
|---|---|
| 0.1.0 | Mar 16, 2025 |
| 0.0.0 | Aug 10, 2022 |
#114 in Finance
134 downloads per month
88KB
2K
SLoC
nyandere
Finally figure out how much everyone owes each other.
Installation
If Rust is already installed,
just write cargo install nyandere!
Usage
Much like one would write an R, Julia or Python script to describe the processing some data, one can write a nyandere script like a receipt!
A script usually consists of 3 phases:
creation,
transfer and
analysis.
See asset/examples/typical.nyan
for a small typical script.
The syntax is inspired by SQL.
It is case-sensitive, though.
A rough overview, the exact description is in
doc/syntax.abnf:
-
A script consists of any number of statements delimited by newlines or semicolons.
- Comments are initiated by hashtags (
#) and last until the next newline.
- Comments are initiated by hashtags (
-
Each statement consists of a command and arguments.
-
The command consists of one or more identifiers.
- It dictates the required arguments.
-
There are positional, named and named optional arguments.
-
Positional arguments have their value stated as-is and are "unnamed".
- If there are multiple of them, their order matters.
-
Named arguments consist of
- an identifier specifying which argument is completed
- an equals sign (
=) padded by any number of spaces around it - a value, specification depends on type
-
Named optional arguments are shown in (parentheses).
The parameters in the commands below have the types required by them shown in PascalCase. Types can be:
| type | example | description |
|---|---|---|
Name |
someone |
Arbitrary unicode identifier |
Money |
3.14€ |
Euros. The sign needs to be explicit, also possible are ct, eur, EUR, ... |
Gtin |
12345678 |
Global Trade Item Number. Found on barcodes. See the glossary. |
Additionally, there are the types Entity, Concept and Object.
You need to explicitly create them before you can use them
(usually by name),
see the next section.
Creation
| cmd | pos | named |
|---|---|---|
create entity |
Name |
|
create concept |
Name |
price=Money gtin=Gtin |
create object |
Name |
parent=Concept |
The create command family registers new actors.
An actor
is a stateful participant
in an interaction.
They need to be created
before they can be used,
this avoids errors due to typos or the works.
An actor is one of the following:
- Entity: Holds a balance to other entities and can make deliveries.
- Concept: An off-the-shelf somewhat standardized product with a name, optionally a default price and optionally a GTIN.
- Object: One physical object, possibly an instance of a concept.
For example,
this would create 2 entities A, B and
a concept Multikey
with the price of 1.70€ and
the GTIN 10000000,
as well as an object thing with Multikey as parent concept:
create entity A
create entity B
create concept Multikey price=1.70€ gtin=10000000
create object thing parent=Multikey
A few more caveats:
- An object inherits its default price from its parent, if any.
- One can refer to a concept by its name or GTIN iff it's been specified at creation.
- Names and GTINs can be shadowed.
- For example, one can create 2 concepts with the name
cottonafter each other, but only the last created one is accessible by that name. - However, the shadowed actors still exist. They aren't replaced. Existing transfers and parent relationships aren't changed by shadowing.
- For example, one can create 2 concepts with the name
- Specifying products by name looks up objects before concepts.
Transfer
| cmd | pos | named |
|---|---|---|
pay |
Money |
from=Entity to=Entity |
Transfer value, with
from as creditor (who gives it) and
to as debitor (who receives it).
Analysis
| cmd | pos | named |
|---|---|---|
balance |
from=Entity to=Entity |
How much does from owe towards to,
all transfers summed up accordingly?
Glossary
Terms you may stumble across when using this. These are to the best of my knowledge from what I know and found on Wikipedia:
Accounting terms
Credit and debit work in tandem: A giving a credit to B is equivalent to B receiving a debit from A.
Account
Sequence of transactions forming a standing value.
Accounts are called entities in nyandere. The standing values are not directly implemented: Instead relational values between each entity-pair are kept.
Transaction
Moving value from or to an account. Always involves exactly one credit and one debit: The value comes from somewhere and goes somewhere.
Credit
Outgoing transaction away from an account.
A having a credit with B means that
A trusts B with some value.
Compare with Latin "credere" = to trust.
Debit
Incoming transaction into an account.
A having a debit from B means that
A has been given some value from B.
Compare with Latin "debere" = to give.
GTIN
A base10 number with no leading zeroes between 8 and 14 digits long, both inclusive. Standard-wise they are actually only available in even fewer versions.
Thought for use with a barcode scanner, there's cheap used ones connectable via USB.
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Please do note that while I do hope this is useful to some, this is a project created in my personal free time. I am not a professional, nor is this a product I am selling.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Dependencies
~4–16MB
~150K SLoC