-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparseargs.es
More file actions
82 lines (79 loc) · 1.62 KB
/
parseargs.es
File metadata and controls
82 lines (79 loc) · 1.62 KB
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env es
fn es_canonicalize_args args {
let (res=;tmp=) {
for (i = $args) {
if {~ $i '-'^*} {
tmp = <={~~ $i '-'^*}
if {eq <={%count $:tmp} 0} {
res = $res '-'
} {gt <={%count $:tmp} 1} {
res = $res '-'^<={%strlist $tmp}
} {
res = $res $i
}
} {
if {! ~ <={%count $:i} 0} {
res = $res $i
}
}
}
result $res
}
}
let (
fn es_run_parseargs argfn usagefn args {
local (
i = 1
argslen = $#args
cur =
next =
advance = 1
flagarg = ''
get-flagarg = @{
if {~ $next '-'^*} {
throw parseargs_error
} {~ $#next 0 } {
throw parseargs_error
} {
advance = 2
result $next
}
}
fn-usage = @{ throw parseargs_error }
fn-done = @{ throw parseargs_done }
fn-has_argument = @{ if {! ~ $next '-'^* && ! ~ $#next 0} { true } { false } }
) {
catch @ e t m {
if {~ $e parseargs_error} {
$usagefn
result <=false
} {~ $e parseargs_done} {
result <=true $args
} {
throw $e $t $m
}
} {
while {lte $i $argslen} {
advance = 1
cur = $args(1)
if {! ~ $cur '-'^*} { throw parseargs_done }
next = $args(2)
$argfn $cur
i = <={add $i $advance}
args = $args(<={add 1 $advance} ...)
}
result <=true $args
}
}
}
) {
fn parseargs argfn maybe-usagefn maybe-args {
if {~ $maybe-usagefn '@'^* || ~ $maybe-usagefn '%closure'^*} {
es_run_parseargs $argfn $maybe-usagefn <={es_canonicalize_args $maybe-args}
} {
es_run_parseargs $argfn \
@{throw error usage 'invalid arguments'} \
<={es_canonicalize_args $maybe-usagefn $maybe-args}
}
}
}