m-chrzan.xyz
aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcin Chrzanowski <marcin.j.chrzanowski@gmail.com>2017-07-16 00:15:06 -0400
committerMarcin Chrzanowski <marcin.j.chrzanowski@gmail.com>2017-07-16 00:15:06 -0400
commit74a6ec5fe5d1d10c465c231e64c7b964476464f3 (patch)
treea6a542f9bbf96cb90f1cb316937a8ba004a35889
parent3e11f6c8268066068c45f4fd760516b8de4a4b28 (diff)
Implement CLI
-rw-r--r--README.md23
-rwxr-xr-xbin/dicebag.js46
-rw-r--r--package.json3
3 files changed, 71 insertions, 1 deletions
diff --git a/README.md b/README.md
index e2474b3..711a25c 100644
--- a/README.md
+++ b/README.md
@@ -4,9 +4,30 @@ A dice expression parser and roller.
## Installation
+ # in a local node_modules/
npm install --save dicebag
+ # globally, to use the CLI
+ npm install -g dicebag
-## Usage
+## Command-line usage
+
+ dicebag [-p] [<dice expression>]
+
+If a dice expression is provided, prints the result of rolling those dice and
+exits. Otherwise, reads expressions from `stdin` in a loop.
+
+* `-p` print dice pools (default behavior is to print the dice's sum)
+
+### Examples
+
+ $ dicebag 1d6
+ 1
+ $ dicebag "2d8 + 1d4"
+ 7
+ $ dicebag -p "2d8 + 1d4"
+ [ 5, 3, 4 ]
+
+## Library usage
const { parse, pool, roll } = require('dicebag')
diff --git a/bin/dicebag.js b/bin/dicebag.js
new file mode 100755
index 0000000..f7b0921
--- /dev/null
+++ b/bin/dicebag.js
@@ -0,0 +1,46 @@
+#!/usr/bin/env node
+/* eslint no-console: 0 */
+
+const { parse, roll, pool } = require('../index.js')
+
+const parseArgs = () => {
+ const args = process.argv.slice(2)
+ const parsedArgs = {
+ roller: roll,
+ expression: null
+ }
+
+ while (args.length > 0) {
+ const arg = args.shift()
+ if (arg === '-p') {
+ parsedArgs.roller = pool
+ } else {
+ parsedArgs.expression = arg
+ }
+ }
+
+ return parsedArgs
+}
+
+const rollDie = (string, roller) => {
+ try {
+ const die = parse(string.trim())
+ console.log(roller(die))
+ } catch (error) {
+ console.log(error.message)
+ }
+}
+
+const runIoLoop = (roller) => {
+ process.stdin.setEncoding('utf8')
+ process.stdin.on('data', (string) => {
+ rollDie(string, roller)
+ })
+}
+
+const parsedArgs = parseArgs()
+if (parsedArgs.expression) {
+ rollDie(parsedArgs.expression, parsedArgs.roller)
+} else {
+ runIoLoop(parsedArgs.roller)
+}
diff --git a/package.json b/package.json
index 6179d97..1a41e81 100644
--- a/package.json
+++ b/package.json
@@ -8,6 +8,9 @@
"test": "jest",
"lint": "eslint ."
},
+ "bin": {
+ "dicebag": "./bin/dicebag.js"
+ },
"repository": {
"type": "git",
"url": "git+https://github.com/m-chrzan/dicebag.git"