1 ## our_shell: ysh
2 ## oils_failures_allowed: 0
3
4 #### ctx push and set
5 var mydict = {}
6 ctx push (mydict) {
7 ctx set (key1="value1")
8 ctx set (key2="value2")
9 }
10 json write (mydict)
11 ## STDOUT:
12 {
13 "key1": "value1",
14 "key2": "value2"
15 }
16 ## END
17
18 #### ctx emit
19 var p = {}
20 ctx push (p) {
21 ctx emit flag ({short_name: '-v'})
22 # p => {'flag': [{short_name: '-v'}]}
23 json write (p)
24
25 ctx emit flag ({short_name: '-c'})
26 # p => {'flag': [{short_name: '-v'}, {short_name: '-c'}]}
27 json write (p)
28 }
29 json write (p)
30 ## STDOUT:
31 {
32 "flag": [
33 {
34 "short_name": "-v"
35 }
36 ]
37 }
38 {
39 "flag": [
40 {
41 "short_name": "-v"
42 },
43 {
44 "short_name": "-c"
45 }
46 ]
47 }
48 {
49 "flag": [
50 {
51 "short_name": "-v"
52 },
53 {
54 "short_name": "-c"
55 }
56 ]
57 }
58 ## END
59
60 #### nested ctx
61 var a = {}
62 var b = {}
63 ctx push (a) {
64 ctx set (from="a")
65 ctx push (b) {
66 ctx set (from="b")
67 }
68 }
69 json write (a)
70 json write (b)
71 ## STDOUT:
72 {
73 "from": "a"
74 }
75 {
76 "from": "b"
77 }
78 ## END
79
80 #### error in context
81 var a = {}
82 try {
83 ctx push (a) {
84 error "Error from inside a context" (code=100)
85 }
86 }
87 echo status=$_status
88 exit 0
89 ## STDOUT:
90 status=100
91 ## END
92
93 #### no context, set
94 ctx set (bad=true)
95 echo status=$_status
96 ## status: 3
97 ## STDOUT:
98 ## END
99
100 #### no context, emit
101 ctx emit bad (true)
102 echo status=$_status
103 ## status: 3
104 ## STDOUT:
105 ## END
106
107 #### mini-parseArgs
108 proc parser (; place ; ; block_def) {
109 var p = {}
110 ctx push (p; ; block_def)
111 call place->setValue(p)
112 }
113
114 var Bool = "Bool"
115 var Int = "Int"
116 proc flag (short_name, long_name; type; help) {
117 ctx emit flag ({short_name, long_name, type, help})
118 }
119
120 proc arg (name) {
121 ctx emit arg ({name})
122 }
123
124 parser (&spec) {
125 flag -t --tsv (Bool, help='Output as a TSV')
126 flag -r --recursive (Bool, help='Recurse into the given directory')
127 flag -N --count (Int, help='Process no more than N files')
128 arg path
129 }
130 json write (spec)
131 ## STDOUT:
132 {
133 "flag": [
134 {
135 "short_name": "-t",
136 "long_name": "--tsv",
137 "type": "Bool",
138 "help": "Output as a TSV"
139 },
140 {
141 "short_name": "-r",
142 "long_name": "--recursive",
143 "type": "Bool",
144 "help": "Recurse into the given directory"
145 },
146 {
147 "short_name": "-N",
148 "long_name": "--count",
149 "type": "Int",
150 "help": "Process no more than N files"
151 }
152 ],
153 "arg": [
154 {
155 "name": "path"
156 }
157 ]
158 }
159 ## END
160
161 #### ctx with value.Place, not List/Dict (error location bug fix)
162
163 ctx push (&p) {
164 true
165 }
166 ## status: 3
167 ## STDOUT:
168 ## END