From 0d90173d7abe69a37ede51a365b2001a730a39bb Mon Sep 17 00:00:00 2001 From: Kasper Date: Fri, 10 Jan 2020 22:54:08 +0100 Subject: [PATCH] Added some dev instructions to README --- README.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/README.md b/README.md index 9934340..061245b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,60 @@ 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) to be a good website for accurate and comprehensive 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 +} +// ... +``` +