Skip to content

Commit 527af4b

Browse files
committed
refactor: add result helpers
1 parent e037442 commit 527af4b

File tree

5 files changed

+34
-64
lines changed

5 files changed

+34
-64
lines changed

.husky/pre-commit

100755100644
File mode changed.

README.md

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,43 +29,27 @@ const result = await parser.parse('-l "hello world"')
2929
```
3030

3131
args.ts can parse Numbers, Booleans and Strings by default, but you can add your own types with the Custom type, or with a custom argument class:
32-
```js
32+
```ts
3333
const myCustomCallback = async (value: string): Promise<ParseResult<number>> => {
3434
if (value == 'success') {
35-
return {
36-
ok: true,
37-
passedValue: value,
38-
returnedValue: 69
39-
}
35+
return this.ok(value, 69)
4036
}
4137

42-
return {
43-
ok: false,
44-
passedValue: value,
45-
error: new Error('error whilst parsing')
46-
}
38+
return this.err(value, new Error('error whilst parsing') )
4739
}
4840
```
49-
```js
41+
```ts
5042
class CustomParseClass extends Argument<number> {
5143
constructor () {
5244
super('custom')
5345
}
5446

5547
public async parse (value: string): Promise<ParseResult<number}>> {
5648
if (value == 'success') {
57-
return {
58-
ok: true,
59-
passedValue: value,
60-
returnedValue: 69
61-
}
49+
return this.ok(value, 69)
6250
}
6351

64-
return {
65-
ok: false,
66-
passedValue: value,
67-
error: new Error('error whilst parsing')
68-
}
52+
return this.err(value, new Error('error whilst parsing') )
6953
}
7054
```
7155
These fetchers can both be async, and the parser will await all promises returned.

src/builder/argument.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,22 @@ export abstract class Argument<TArgType> {
2323
this._isMultiType = isMultiType
2424
}
2525

26+
protected ok <T> (passedValue: string, returnedValue: T): ParseResultOk<T> {
27+
return {
28+
ok: true,
29+
passedValue,
30+
returnedValue
31+
}
32+
}
33+
34+
protected err (passedValue: string, error: Error): ParseResultErr {
35+
return {
36+
ok: false,
37+
passedValue,
38+
error
39+
}
40+
}
41+
2642
public abstract parse (value: string): Promise<ParseResult<TArgType>>
2743

2844
public optional (): Argument<TArgType | undefined> {
Lines changed: 11 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Argument, ParseResult } from '.'
2-
import { ParseError } from '../error'
2+
import { CoercionError } from '../error'
33

44
function makeExport <T, TConst extends new (...args: any[]) => T> (ArgClass: TConst): (...args: ConstructorParameters<TConst>) => T {
55
return (...args: any[]) => new ArgClass(...args)
@@ -11,11 +11,7 @@ class StringArgument extends Argument<string> {
1111
}
1212

1313
async parse (value: string): Promise<ParseResult<string>> {
14-
return {
15-
ok: true,
16-
passedValue: value,
17-
returnedValue: value
18-
}
14+
return this.ok(value, value)
1915
}
2016
}
2117

@@ -30,33 +26,18 @@ class NumberArgument extends Argument<number> {
3026
async parse (value: string): Promise<ParseResult<number>> {
3127
const num = parseInt(value, 10)
3228
if (isNaN(num)) {
33-
return {
34-
ok: false,
35-
passedValue: value,
36-
error: new ParseError(`'${value}' is not a number`)
37-
}
29+
return this.err(value, new CoercionError(`'${value}' is not a number`))
3830
}
3931

4032
if (this._lowerBound && num < this._lowerBound) {
41-
return {
42-
ok: false,
43-
passedValue: value,
44-
error: new ParseError(`${value} is less than lower bound ${this._lowerBound}`)
45-
}
33+
return this.err(value, new CoercionError(`${value} is less than lower bound ${this._lowerBound}`))
4634
}
35+
4736
if (this._upperBound && num > this._upperBound) {
48-
return {
49-
ok: false,
50-
passedValue: value,
51-
error: new ParseError(`${value} is greater than upper bound ${this._upperBound}`)
52-
}
37+
return this.err(value, new CoercionError(`${value} is greater than upper bound ${this._upperBound}`))
5338
}
5439

55-
return {
56-
ok: true,
57-
passedValue: value,
58-
returnedValue: num
59-
}
40+
return this.ok(value, num)
6041
}
6142

6243
lowerBound (bound: number): NumberArgument {
@@ -85,18 +66,10 @@ class BooleanArgument extends Argument<boolean> {
8566

8667
async parse (value: string): Promise<ParseResult<boolean>> {
8768
if (!(value === 'true' || value === 'false')) {
88-
return {
89-
ok: false,
90-
passedValue: value,
91-
error: new ParseError(`'${value}' is not a boolean`)
92-
}
69+
return this.err(value, new CoercionError(`'${value}' is not a boolean`))
9370
}
9471

95-
return {
96-
ok: true,
97-
passedValue: value,
98-
returnedValue: value === 'true'
99-
}
72+
return this.ok(value, value === 'true')
10073
}
10174
}
10275

@@ -113,12 +86,9 @@ class CustomArgument<T> extends Argument<T> {
11386
public async parse (value: string): Promise<ParseResult<T>> {
11487
// User passed no callback
11588
if (!this.cb) {
116-
return {
117-
ok: false,
118-
passedValue: value,
119-
error: new ParseError('callback was not provided')
120-
}
89+
return this.err(value, new CoercionError('callback was not provided'))
12190
}
91+
12292
return await this.cb(value)
12393
}
12494
}

src/builder/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
export * from './argument'
22
export * from './command'
3-
export * as a from './default'
3+
export * as a from './defaults'

0 commit comments

Comments
 (0)