CPC/README.md
Kasper 5360318bfc Added unit of pressure, improved lexer "post-fix" loop
Previously the lexer's post-fix loop was really weird, incrementing in the middle of the function. No more
2020-01-12 22:57:49 +01:00

61 lines
1.4 KiB
Markdown

calculation + conversion
Uses Decimal Floating Point numbers instead of Binary Coded Decimals for better accuracy.
# Dev Instructions
## Get started
Install [Rust](https://www.rust-lang.org). This project was built in Rust 1.40.
## Commands
Run cpc with a CLI argument as input:
```
cargo run -- '100ms to s'
```
Run tests:
```
cargo test
```
## Adding a unit
### 1. Add the unit
In `src/units.rs`, units are specified like this:
```rs
pub enum UnitType {
Time,
// etc
}
// ...
create_units!(
Nanosecond: (Time, d128!(1)),
Microsecond: (Time, d128!(1000)),
// etc
)
```
The number associated with a unit is it's "weight". For example, if a second's weight is `1`, then a minute's weight is `1000`.
I have found [translatorscafe.com](https://www.translatorscafe.com/unit-converter) and [calculateme.com](https://www.calculateme.com/) to be good websites for unit convertion. Wikipedia is worth looking at as well.
### 2. Add a test for the unit
Make sure to also add a test for each unit. The tests look like this:
```rs
assert_eq!(convert_test(1000.0, Meter, Kilometer), 1.0);
```
Basically, 1000 Meter == 1 Kilometer.
### 3. Add the unit to the lexer
Text is turned into tokens (some of which are units) in `lexer.rs`. Here's one example:
```rs
// ...
match string {
"h" | "hr" | "hrs" | "hour" | "hours" => tokens.push(Token::Unit(Hour)),
// etc
}
// ...
```