@@ -7,7 +7,7 @@ use wasmtime::{
77use wasmtime_wasi:: preview2:: {
88 pipe:: MemoryOutputPipe ,
99 preview1:: { WasiPreview1Adapter , WasiPreview1View } ,
10- DirPerms , FilePerms , WasiCtx , WasiCtxBuilder , WasiView ,
10+ DirPerms , FilePerms , StdinStream , StdoutStream , WasiCtx , WasiCtxBuilder , WasiView ,
1111} ;
1212
1313struct Ctx {
@@ -48,40 +48,98 @@ fn prepare_workspace(exe_name: &str) -> Result<TempDir> {
4848 Ok ( tempdir)
4949}
5050
51- fn store ( engine : & Engine , name : & str , inherit_stdio : bool ) -> Result < ( Store < Ctx > , TempDir ) > {
52- let stdout = MemoryOutputPipe :: new ( 4096 ) ;
53- let stderr = MemoryOutputPipe :: new ( 4096 ) ;
54- let workspace = prepare_workspace ( name) ?;
55-
56- // Create our wasi context.
57- let mut builder = WasiCtxBuilder :: new ( ) ;
58- if inherit_stdio {
59- builder. inherit_stdio ( ) ;
60- } else {
61- builder. stdout ( stdout. clone ( ) ) . stderr ( stderr. clone ( ) ) ;
51+ struct StoreBuilder {
52+ builder : WasiCtxBuilder ,
53+ inherit_stdio : bool ,
54+ workspace : TempDir ,
55+ stdin : Option < Box < dyn StdinStream > > ,
56+ stdout : Option < Box < dyn StdoutStream > > ,
57+ stderr : Option < Box < dyn StdoutStream > > ,
58+ }
59+
60+ impl StoreBuilder {
61+ fn new ( name : & str ) -> Result < Self > {
62+ let mut builder = WasiCtxBuilder :: new ( ) ;
63+
64+ builder
65+ . args ( & [ name, "." ] )
66+ . inherit_network ( )
67+ . allow_ip_name_lookup ( true ) ;
68+
69+ let workspace = prepare_workspace ( name) ?;
70+
71+ Ok ( Self {
72+ builder,
73+ inherit_stdio : false ,
74+ workspace,
75+ stdin : None ,
76+ stdout : None ,
77+ stderr : None ,
78+ } )
6279 }
6380
64- builder
65- . args ( & [ name, "." ] )
66- . inherit_network ( )
67- . allow_ip_name_lookup ( true ) ;
68- println ! ( "preopen: {:?}" , workspace) ;
69- let preopen_dir =
70- cap_std:: fs:: Dir :: open_ambient_dir ( workspace. path ( ) , cap_std:: ambient_authority ( ) ) ?;
71- builder. preopened_dir ( preopen_dir, DirPerms :: all ( ) , FilePerms :: all ( ) , "." ) ;
72- for ( var, val) in test_programs_artifacts:: wasi_tests_environment ( ) {
73- builder. env ( var, val) ;
81+ fn stdout ( & mut self , stdout : Box < dyn StdoutStream > ) -> & mut Self {
82+ self . stdout . replace ( stdout) ;
83+ self
7484 }
7585
76- let ctx = Ctx {
77- table : ResourceTable :: new ( ) ,
78- wasi : builder. build ( ) ,
79- stderr,
80- stdout,
81- adapter : WasiPreview1Adapter :: new ( ) ,
82- } ;
86+ fn stdin ( & mut self , stdin : Box < dyn StdinStream > ) -> & mut Self {
87+ self . stdin . replace ( stdin) ;
88+ self
89+ }
90+
91+ fn build ( mut self , engine : & Engine ) -> Result < ( Store < Ctx > , TempDir ) > {
92+ let stdout = MemoryOutputPipe :: new ( 4096 ) ;
93+ let stderr = MemoryOutputPipe :: new ( 4096 ) ;
94+
95+ // Create our wasi context.
96+ if self . inherit_stdio {
97+ self . builder . inherit_stdio ( ) ;
98+ } else {
99+ if let Some ( stdin) = self . stdin {
100+ self . builder . stdin ( stdin) ;
101+ }
83102
84- Ok ( ( Store :: new ( & engine, ctx) , workspace) )
103+ if let Some ( stdout) = self . stdout {
104+ self . builder . stdout ( stdout) ;
105+ } else {
106+ self . builder . stdout ( stdout. clone ( ) ) ;
107+ }
108+
109+ if let Some ( stderr) = self . stderr {
110+ self . builder . stderr ( stderr) ;
111+ } else {
112+ self . builder . stderr ( stderr. clone ( ) ) ;
113+ }
114+ }
115+
116+ println ! ( "preopen: {:?}" , self . workspace) ;
117+ let preopen_dir = cap_std:: fs:: Dir :: open_ambient_dir (
118+ self . workspace . path ( ) ,
119+ cap_std:: ambient_authority ( ) ,
120+ ) ?;
121+ self . builder
122+ . preopened_dir ( preopen_dir, DirPerms :: all ( ) , FilePerms :: all ( ) , "." ) ;
123+ for ( var, val) in test_programs_artifacts:: wasi_tests_environment ( ) {
124+ self . builder . env ( var, val) ;
125+ }
126+
127+ let ctx = Ctx {
128+ table : ResourceTable :: new ( ) ,
129+ wasi : self . builder . build ( ) ,
130+ stderr,
131+ stdout,
132+ adapter : WasiPreview1Adapter :: new ( ) ,
133+ } ;
134+
135+ Ok ( ( Store :: new ( & engine, ctx) , self . workspace ) )
136+ }
137+ }
138+
139+ fn store ( engine : & Engine , name : & str , inherit_stdio : bool ) -> Result < ( Store < Ctx > , TempDir ) > {
140+ let mut builder = StoreBuilder :: new ( name) ?;
141+ builder. inherit_stdio = inherit_stdio;
142+ builder. build ( engine)
85143}
86144
87145impl Drop for Ctx {
@@ -108,5 +166,6 @@ macro_rules! assert_test_exists {
108166
109167mod api;
110168mod async_;
169+ mod piped;
111170mod preview1;
112171mod sync;
0 commit comments