1*133a0ef4SChris Fallinpackage wasi:[email protected];
2*133a0ef4SChris Fallin
3*133a0ef4SChris Fallin@since(version = 0.2.0)
4*133a0ef4SChris Fallininterface environment {
5*133a0ef4SChris Fallin  /// Get the POSIX-style environment variables.
6*133a0ef4SChris Fallin  ///
7*133a0ef4SChris Fallin  /// Each environment variable is provided as a pair of string variable names
8*133a0ef4SChris Fallin  /// and string value.
9*133a0ef4SChris Fallin  ///
10*133a0ef4SChris Fallin  /// Morally, these are a value import, but until value imports are available
11*133a0ef4SChris Fallin  /// in the component model, this import function should return the same
12*133a0ef4SChris Fallin  /// values each time it is called.
13*133a0ef4SChris Fallin  @since(version = 0.2.0)
14*133a0ef4SChris Fallin  get-environment: func() -> list<tuple<string, string>>;
15*133a0ef4SChris Fallin
16*133a0ef4SChris Fallin  /// Get the POSIX-style arguments to the program.
17*133a0ef4SChris Fallin  @since(version = 0.2.0)
18*133a0ef4SChris Fallin  get-arguments: func() -> list<string>;
19*133a0ef4SChris Fallin
20*133a0ef4SChris Fallin  /// Return a path that programs should use as their initial current working
21*133a0ef4SChris Fallin  /// directory, interpreting `.` as shorthand for this.
22*133a0ef4SChris Fallin  @since(version = 0.2.0)
23*133a0ef4SChris Fallin  initial-cwd: func() -> option<string>;
24*133a0ef4SChris Fallin}
25*133a0ef4SChris Fallin
26*133a0ef4SChris Fallin@since(version = 0.2.0)
27*133a0ef4SChris Fallininterface exit {
28*133a0ef4SChris Fallin  /// Exit the current instance and any linked instances.
29*133a0ef4SChris Fallin  @since(version = 0.2.0)
30*133a0ef4SChris Fallin  exit: func(status: result);
31*133a0ef4SChris Fallin
32*133a0ef4SChris Fallin  /// Exit the current instance and any linked instances, reporting the
33*133a0ef4SChris Fallin  /// specified status code to the host.
34*133a0ef4SChris Fallin  ///
35*133a0ef4SChris Fallin  /// The meaning of the code depends on the context, with 0 usually meaning
36*133a0ef4SChris Fallin  /// "success", and other values indicating various types of failure.
37*133a0ef4SChris Fallin  ///
38*133a0ef4SChris Fallin  /// This function does not return; the effect is analogous to a trap, but
39*133a0ef4SChris Fallin  /// without the connotation that something bad has happened.
40*133a0ef4SChris Fallin  @unstable(feature = cli-exit-with-code)
41*133a0ef4SChris Fallin  exit-with-code: func(status-code: u8);
42*133a0ef4SChris Fallin}
43*133a0ef4SChris Fallin
44*133a0ef4SChris Fallin@since(version = 0.2.0)
45*133a0ef4SChris Fallininterface run {
46*133a0ef4SChris Fallin  /// Run the program.
47*133a0ef4SChris Fallin  @since(version = 0.2.0)
48*133a0ef4SChris Fallin  run: func() -> result;
49*133a0ef4SChris Fallin}
50*133a0ef4SChris Fallin
51*133a0ef4SChris Fallin@since(version = 0.2.0)
52*133a0ef4SChris Fallininterface stdin {
53*133a0ef4SChris Fallin  @since(version = 0.2.0)
54*133a0ef4SChris Fallin  use wasi:io/streams@0.2.6.{input-stream};
55*133a0ef4SChris Fallin
56*133a0ef4SChris Fallin  @since(version = 0.2.0)
57*133a0ef4SChris Fallin  get-stdin: func() -> input-stream;
58*133a0ef4SChris Fallin}
59*133a0ef4SChris Fallin
60*133a0ef4SChris Fallin@since(version = 0.2.0)
61*133a0ef4SChris Fallininterface stdout {
62*133a0ef4SChris Fallin  @since(version = 0.2.0)
63*133a0ef4SChris Fallin  use wasi:io/streams@0.2.6.{output-stream};
64*133a0ef4SChris Fallin
65*133a0ef4SChris Fallin  @since(version = 0.2.0)
66*133a0ef4SChris Fallin  get-stdout: func() -> output-stream;
67*133a0ef4SChris Fallin}
68*133a0ef4SChris Fallin
69*133a0ef4SChris Fallin@since(version = 0.2.0)
70*133a0ef4SChris Fallininterface stderr {
71*133a0ef4SChris Fallin  @since(version = 0.2.0)
72*133a0ef4SChris Fallin  use wasi:io/streams@0.2.6.{output-stream};
73*133a0ef4SChris Fallin
74*133a0ef4SChris Fallin  @since(version = 0.2.0)
75*133a0ef4SChris Fallin  get-stderr: func() -> output-stream;
76*133a0ef4SChris Fallin}
77*133a0ef4SChris Fallin
78*133a0ef4SChris Fallin/// Terminal input.
79*133a0ef4SChris Fallin///
80*133a0ef4SChris Fallin/// In the future, this may include functions for disabling echoing,
81*133a0ef4SChris Fallin/// disabling input buffering so that keyboard events are sent through
82*133a0ef4SChris Fallin/// immediately, querying supported features, and so on.
83*133a0ef4SChris Fallin@since(version = 0.2.0)
84*133a0ef4SChris Fallininterface terminal-input {
85*133a0ef4SChris Fallin  /// The input side of a terminal.
86*133a0ef4SChris Fallin  @since(version = 0.2.0)
87*133a0ef4SChris Fallin  resource terminal-input;
88*133a0ef4SChris Fallin}
89*133a0ef4SChris Fallin
90*133a0ef4SChris Fallin/// Terminal output.
91*133a0ef4SChris Fallin///
92*133a0ef4SChris Fallin/// In the future, this may include functions for querying the terminal
93*133a0ef4SChris Fallin/// size, being notified of terminal size changes, querying supported
94*133a0ef4SChris Fallin/// features, and so on.
95*133a0ef4SChris Fallin@since(version = 0.2.0)
96*133a0ef4SChris Fallininterface terminal-output {
97*133a0ef4SChris Fallin  /// The output side of a terminal.
98*133a0ef4SChris Fallin  @since(version = 0.2.0)
99*133a0ef4SChris Fallin  resource terminal-output;
100*133a0ef4SChris Fallin}
101*133a0ef4SChris Fallin
102*133a0ef4SChris Fallin/// An interface providing an optional `terminal-input` for stdin as a
103*133a0ef4SChris Fallin/// link-time authority.
104*133a0ef4SChris Fallin@since(version = 0.2.0)
105*133a0ef4SChris Fallininterface terminal-stdin {
106*133a0ef4SChris Fallin  @since(version = 0.2.0)
107*133a0ef4SChris Fallin  use terminal-input.{terminal-input};
108*133a0ef4SChris Fallin
109*133a0ef4SChris Fallin  /// If stdin is connected to a terminal, return a `terminal-input` handle
110*133a0ef4SChris Fallin  /// allowing further interaction with it.
111*133a0ef4SChris Fallin  @since(version = 0.2.0)
112*133a0ef4SChris Fallin  get-terminal-stdin: func() -> option<terminal-input>;
113*133a0ef4SChris Fallin}
114*133a0ef4SChris Fallin
115*133a0ef4SChris Fallin/// An interface providing an optional `terminal-output` for stdout as a
116*133a0ef4SChris Fallin/// link-time authority.
117*133a0ef4SChris Fallin@since(version = 0.2.0)
118*133a0ef4SChris Fallininterface terminal-stdout {
119*133a0ef4SChris Fallin  @since(version = 0.2.0)
120*133a0ef4SChris Fallin  use terminal-output.{terminal-output};
121*133a0ef4SChris Fallin
122*133a0ef4SChris Fallin  /// If stdout is connected to a terminal, return a `terminal-output` handle
123*133a0ef4SChris Fallin  /// allowing further interaction with it.
124*133a0ef4SChris Fallin  @since(version = 0.2.0)
125*133a0ef4SChris Fallin  get-terminal-stdout: func() -> option<terminal-output>;
126*133a0ef4SChris Fallin}
127*133a0ef4SChris Fallin
128*133a0ef4SChris Fallin/// An interface providing an optional `terminal-output` for stderr as a
129*133a0ef4SChris Fallin/// link-time authority.
130*133a0ef4SChris Fallin@since(version = 0.2.0)
131*133a0ef4SChris Fallininterface terminal-stderr {
132*133a0ef4SChris Fallin  @since(version = 0.2.0)
133*133a0ef4SChris Fallin  use terminal-output.{terminal-output};
134*133a0ef4SChris Fallin
135*133a0ef4SChris Fallin  /// If stderr is connected to a terminal, return a `terminal-output` handle
136*133a0ef4SChris Fallin  /// allowing further interaction with it.
137*133a0ef4SChris Fallin  @since(version = 0.2.0)
138*133a0ef4SChris Fallin  get-terminal-stderr: func() -> option<terminal-output>;
139*133a0ef4SChris Fallin}
140*133a0ef4SChris Fallin
141*133a0ef4SChris Fallin@since(version = 0.2.0)
142*133a0ef4SChris Fallinworld imports {
143*133a0ef4SChris Fallin  @since(version = 0.2.0)
144*133a0ef4SChris Fallin  import environment;
145*133a0ef4SChris Fallin  @since(version = 0.2.0)
146*133a0ef4SChris Fallin  import exit;
147*133a0ef4SChris Fallin  @since(version = 0.2.0)
148*133a0ef4SChris Fallin  import wasi:io/error@0.2.6;
149*133a0ef4SChris Fallin  @since(version = 0.2.0)
150*133a0ef4SChris Fallin  import wasi:io/poll@0.2.6;
151*133a0ef4SChris Fallin  @since(version = 0.2.0)
152*133a0ef4SChris Fallin  import wasi:io/streams@0.2.6;
153*133a0ef4SChris Fallin  @since(version = 0.2.0)
154*133a0ef4SChris Fallin  import stdin;
155*133a0ef4SChris Fallin  @since(version = 0.2.0)
156*133a0ef4SChris Fallin  import stdout;
157*133a0ef4SChris Fallin  @since(version = 0.2.0)
158*133a0ef4SChris Fallin  import stderr;
159*133a0ef4SChris Fallin  @since(version = 0.2.0)
160*133a0ef4SChris Fallin  import terminal-input;
161*133a0ef4SChris Fallin  @since(version = 0.2.0)
162*133a0ef4SChris Fallin  import terminal-output;
163*133a0ef4SChris Fallin  @since(version = 0.2.0)
164*133a0ef4SChris Fallin  import terminal-stdin;
165*133a0ef4SChris Fallin  @since(version = 0.2.0)
166*133a0ef4SChris Fallin  import terminal-stdout;
167*133a0ef4SChris Fallin  @since(version = 0.2.0)
168*133a0ef4SChris Fallin  import terminal-stderr;
169*133a0ef4SChris Fallin  @since(version = 0.2.0)
170*133a0ef4SChris Fallin  import wasi:clocks/monotonic-clock@0.2.6;
171*133a0ef4SChris Fallin  @since(version = 0.2.0)
172*133a0ef4SChris Fallin  import wasi:clocks/wall-clock@0.2.6;
173*133a0ef4SChris Fallin  @unstable(feature = clocks-timezone)
174*133a0ef4SChris Fallin  import wasi:clocks/timezone@0.2.6;
175*133a0ef4SChris Fallin  @since(version = 0.2.0)
176*133a0ef4SChris Fallin  import wasi:filesystem/types@0.2.6;
177*133a0ef4SChris Fallin  @since(version = 0.2.0)
178*133a0ef4SChris Fallin  import wasi:filesystem/preopens@0.2.6;
179*133a0ef4SChris Fallin  @since(version = 0.2.0)
180*133a0ef4SChris Fallin  import wasi:sockets/network@0.2.6;
181*133a0ef4SChris Fallin  @since(version = 0.2.0)
182*133a0ef4SChris Fallin  import wasi:sockets/instance-network@0.2.6;
183*133a0ef4SChris Fallin  @since(version = 0.2.0)
184*133a0ef4SChris Fallin  import wasi:sockets/udp@0.2.6;
185*133a0ef4SChris Fallin  @since(version = 0.2.0)
186*133a0ef4SChris Fallin  import wasi:sockets/udp-create-socket@0.2.6;
187*133a0ef4SChris Fallin  @since(version = 0.2.0)
188*133a0ef4SChris Fallin  import wasi:sockets/tcp@0.2.6;
189*133a0ef4SChris Fallin  @since(version = 0.2.0)
190*133a0ef4SChris Fallin  import wasi:sockets/tcp-create-socket@0.2.6;
191*133a0ef4SChris Fallin  @since(version = 0.2.0)
192*133a0ef4SChris Fallin  import wasi:sockets/ip-name-lookup@0.2.6;
193*133a0ef4SChris Fallin  @since(version = 0.2.0)
194*133a0ef4SChris Fallin  import wasi:random/random@0.2.6;
195*133a0ef4SChris Fallin  @since(version = 0.2.0)
196*133a0ef4SChris Fallin  import wasi:random/insecure@0.2.6;
197*133a0ef4SChris Fallin  @since(version = 0.2.0)
198*133a0ef4SChris Fallin  import wasi:random/insecure-seed@0.2.6;
199*133a0ef4SChris Fallin}
200*133a0ef4SChris Fallin@since(version = 0.2.0)
201*133a0ef4SChris Fallinworld command {
202*133a0ef4SChris Fallin  @since(version = 0.2.0)
203*133a0ef4SChris Fallin  import environment;
204*133a0ef4SChris Fallin  @since(version = 0.2.0)
205*133a0ef4SChris Fallin  import exit;
206*133a0ef4SChris Fallin  @since(version = 0.2.0)
207*133a0ef4SChris Fallin  import wasi:io/error@0.2.6;
208*133a0ef4SChris Fallin  @since(version = 0.2.0)
209*133a0ef4SChris Fallin  import wasi:io/poll@0.2.6;
210*133a0ef4SChris Fallin  @since(version = 0.2.0)
211*133a0ef4SChris Fallin  import wasi:io/streams@0.2.6;
212*133a0ef4SChris Fallin  @since(version = 0.2.0)
213*133a0ef4SChris Fallin  import stdin;
214*133a0ef4SChris Fallin  @since(version = 0.2.0)
215*133a0ef4SChris Fallin  import stdout;
216*133a0ef4SChris Fallin  @since(version = 0.2.0)
217*133a0ef4SChris Fallin  import stderr;
218*133a0ef4SChris Fallin  @since(version = 0.2.0)
219*133a0ef4SChris Fallin  import terminal-input;
220*133a0ef4SChris Fallin  @since(version = 0.2.0)
221*133a0ef4SChris Fallin  import terminal-output;
222*133a0ef4SChris Fallin  @since(version = 0.2.0)
223*133a0ef4SChris Fallin  import terminal-stdin;
224*133a0ef4SChris Fallin  @since(version = 0.2.0)
225*133a0ef4SChris Fallin  import terminal-stdout;
226*133a0ef4SChris Fallin  @since(version = 0.2.0)
227*133a0ef4SChris Fallin  import terminal-stderr;
228*133a0ef4SChris Fallin  @since(version = 0.2.0)
229*133a0ef4SChris Fallin  import wasi:clocks/monotonic-clock@0.2.6;
230*133a0ef4SChris Fallin  @since(version = 0.2.0)
231*133a0ef4SChris Fallin  import wasi:clocks/wall-clock@0.2.6;
232*133a0ef4SChris Fallin  @unstable(feature = clocks-timezone)
233*133a0ef4SChris Fallin  import wasi:clocks/timezone@0.2.6;
234*133a0ef4SChris Fallin  @since(version = 0.2.0)
235*133a0ef4SChris Fallin  import wasi:filesystem/types@0.2.6;
236*133a0ef4SChris Fallin  @since(version = 0.2.0)
237*133a0ef4SChris Fallin  import wasi:filesystem/preopens@0.2.6;
238*133a0ef4SChris Fallin  @since(version = 0.2.0)
239*133a0ef4SChris Fallin  import wasi:sockets/network@0.2.6;
240*133a0ef4SChris Fallin  @since(version = 0.2.0)
241*133a0ef4SChris Fallin  import wasi:sockets/instance-network@0.2.6;
242*133a0ef4SChris Fallin  @since(version = 0.2.0)
243*133a0ef4SChris Fallin  import wasi:sockets/udp@0.2.6;
244*133a0ef4SChris Fallin  @since(version = 0.2.0)
245*133a0ef4SChris Fallin  import wasi:sockets/udp-create-socket@0.2.6;
246*133a0ef4SChris Fallin  @since(version = 0.2.0)
247*133a0ef4SChris Fallin  import wasi:sockets/tcp@0.2.6;
248*133a0ef4SChris Fallin  @since(version = 0.2.0)
249*133a0ef4SChris Fallin  import wasi:sockets/tcp-create-socket@0.2.6;
250*133a0ef4SChris Fallin  @since(version = 0.2.0)
251*133a0ef4SChris Fallin  import wasi:sockets/ip-name-lookup@0.2.6;
252*133a0ef4SChris Fallin  @since(version = 0.2.0)
253*133a0ef4SChris Fallin  import wasi:random/random@0.2.6;
254*133a0ef4SChris Fallin  @since(version = 0.2.0)
255*133a0ef4SChris Fallin  import wasi:random/insecure@0.2.6;
256*133a0ef4SChris Fallin  @since(version = 0.2.0)
257*133a0ef4SChris Fallin  import wasi:random/insecure-seed@0.2.6;
258*133a0ef4SChris Fallin
259*133a0ef4SChris Fallin  @since(version = 0.2.0)
260*133a0ef4SChris Fallin  export run;
261*133a0ef4SChris Fallin}
262