forked from frodwith/yanop
/
yanop.coffee
66 lines (55 loc) · 1.75 KB
/
yanop.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
path = require 'path'
reexport = (module) ->
m = require module
exports[key] = val for own key, val of m
reexport m for m in [
'./types'
'./exceptions'
'./Parser'
'./Help'
]
getargs = (argv) -> argv or process.argv.slice 2
exports.parse = (spec, argv) ->
new exports.Parser(spec).parse getargs argv
exports.zero = () ->
abs = path.normalize process.argv[1]
rel = path.relative process.cwd(), abs
script = if rel.length < abs.length then rel else abs
"#{ process.argv[0] } #{ script }"
exports.usage = () -> "\nUsage: #{ exports.zero() } [OPTIONS]\n"
exports.help = (spec) -> new exports.Help(spec).toString()
exports.tryParse = (spec, argv) ->
p = new exports.Parser(spec)
try
o = p.parse getargs argv
catch e
throw e unless e instanceof exports.ParseError
process.stderr.write e.message + "\n"
process.exit 1
return o
exports.simple = exports.tryParseWithHelp = (spec, banner, argv) ->
spec.help or=
type: exports.flag
short: 'h'
description: 'Print this message and exit'
p = new exports.Parser spec
try
argv = getargs argv
o = p.parse getargs argv
if o.help
h = exports.help spec
banner or= exports.usage()
process.stdout.write [
banner
"The following options are recognized:\n"
h,
].join("\n") + "\n\n"
process.exit 0
catch e
throw e unless e instanceof exports.ParseError
h = spec.help
flag = if h.long then "--#{ h.long }" else "-#{ h.short }"
process.stderr.write e.message +
". Pass #{ flag } for usage information.\n"
process.exit 1
return o