@@ -32,18 +32,19 @@ pub fn execution_stub_result_page(
3232 <p>{ "function not found" } </p>
3333 } ;
3434 } ;
35- let ( fn_detail , _ ) = app_state
35+ let maybe_return_type = & app_state
3636 . ffqns_to_details
3737 . get ( ffqn)
38- . expect ( "`ffqns_to_details` and `comopnents_by_exported_ifc` must be consistent, based from `ListComponentsResponse`" ) ;
38+ . expect ( "`ffqns_to_details` and `comopnents_by_exported_ifc` must be consistent, based from `ListComponentsResponse`" ) . 0
39+ . return_type ;
3940
4041 let component_id = component
4142 . component_id
4243 . clone ( )
4344 . expect ( "`component_id` is sent" ) ;
4445 // disable the submit button while a request is inflight
4546 let request_processing_state = use_state ( || false ) ;
46- let input_state = use_state ( NodeRef :: default ) ;
47+ let input_ref = use_node_ref ( ) ;
4748 let err_state = use_state ( || None ) ;
4849
4950 let wit_state: UseStateHandle < Option < String > > = use_state ( || None ) ;
@@ -73,28 +74,31 @@ pub fn execution_stub_result_page(
7374
7475 let on_submit = {
7576 let request_processing_state = request_processing_state. clone ( ) ;
76- let input_state = input_state. clone ( ) ;
7777 let err_state = err_state. clone ( ) ;
7878 let ffqn = ffqn. clone ( ) ;
7979 let navigator = use_navigator ( ) . unwrap ( ) ;
8080 let execution_id = execution_id. clone ( ) ;
81+ let input_ref = input_ref. clone ( ) ;
82+ let is_ret_some = maybe_return_type. is_some ( ) ;
8183 Callback :: from ( move |e : SubmitEvent | {
8284 e. prevent_default ( ) ; // prevent form submission
83- let input = input_state
84- . deref ( )
85- . cast :: < HtmlInputElement > ( )
86- . unwrap ( )
87- . value ( ) ;
88- match serde_json:: from_str :: < serde_json:: Value > ( & input) {
89- Ok ( _) => {
90- debug ! ( "serde ok" )
91- }
92- Err ( serde_err) => {
93- error ! ( "Cannot serialize input - {serde_err:?}" ) ;
94- err_state. set ( Some ( format ! ( "cannot serialize input - {serde_err}" ) ) ) ;
95- return ;
96- }
85+ let input = if is_ret_some {
86+ let input = input_ref. cast :: < HtmlInputElement > ( ) . unwrap ( ) . value ( ) ;
87+ match serde_json:: from_str :: < serde_json:: Value > ( & input) {
88+ Ok ( _) => {
89+ debug ! ( "serde ok" )
90+ }
91+ Err ( serde_err) => {
92+ error ! ( "Cannot serialize input - {serde_err:?}" ) ;
93+ err_state. set ( Some ( format ! ( "cannot serialize input - {serde_err}" ) ) ) ;
94+ return ;
95+ }
96+ } ;
97+ Some ( input)
98+ } else {
99+ None
97100 } ;
101+
98102 debug ! ( "Input: {input:?}" ) ;
99103 {
100104 err_state. set ( None ) ;
@@ -117,7 +121,7 @@ pub fn execution_stub_result_page(
117121 let response = client
118122 . stub ( grpc_client:: StubRequest {
119123 execution_id : Some ( execution_id. clone ( ) ) ,
120- return_value : Some ( prost_wkt_types:: Any {
124+ return_value : input . map ( |input| prost_wkt_types:: Any {
121125 type_url : format ! ( "urn:obelisk:json:retval:{ffqn}" ) ,
122126 value : input. into_bytes ( ) ,
123127 } ) ,
@@ -139,39 +143,38 @@ pub fn execution_stub_result_page(
139143 } ;
140144
141145 // Validate on first render
142- use_effect_with ( input_state . deref ( ) . clone ( ) , {
146+ use_effect_with ( ( ) , {
143147 let err_state = err_state. clone ( ) ;
144- let fn_detail = fn_detail . clone ( ) ;
145- let input_state = input_state . clone ( ) ;
148+ let input_ref = input_ref . clone ( ) ;
149+ let maybe_return_type = maybe_return_type . clone ( ) ;
146150 move |_| {
147- debug ! ( "Validating the form after first render" ) ;
148- let input = input_state
149- . deref ( )
150- . cast :: < HtmlInputElement > ( )
151- . unwrap ( )
152- . value ( ) ;
153- if let Err ( err) = validate_response ( & fn_detail, & input) {
154- err_state. set ( Some ( err) ) ;
155- } else {
156- err_state. set ( None ) ;
151+ if let Some ( return_type) = maybe_return_type {
152+ debug ! ( "Validating the form after first render" ) ;
153+ let input = input_ref. cast :: < HtmlInputElement > ( ) . unwrap ( ) . value ( ) ;
154+ if let Err ( err) = validate_response ( & return_type, & input) {
155+ err_state. set ( Some ( err) ) ;
156+ } else {
157+ err_state. set ( None ) ;
158+ }
157159 }
158160 }
159161 } ) ;
162+
160163 let oninput = {
161- let input_state = input_state . clone ( ) ;
162- let err_state = err_state. clone ( ) ;
163- let fn_detail = fn_detail . clone ( ) ;
164- move |_| {
165- let input = input_state
166- . deref ( )
167- . cast :: < HtmlInputElement > ( )
168- . unwrap ( )
169- . value ( ) ;
170- if let Err ( err ) = validate_response ( & fn_detail , & input ) {
171- err_state . set ( Some ( err ) ) ;
172- } else {
173- err_state . set ( None ) ;
174- }
164+ if let Some ( return_type ) = maybe_return_type {
165+ let err_state = err_state. clone ( ) ;
166+ let return_type = return_type . clone ( ) ;
167+ let input_ref = input_ref . clone ( ) ;
168+ Some ( move |_| {
169+ let input = input_ref . cast :: < HtmlInputElement > ( ) . unwrap ( ) . value ( ) ;
170+ if let Err ( err ) = validate_response ( & return_type , & input ) {
171+ err_state . set ( Some ( err ) ) ;
172+ } else {
173+ err_state . set ( None ) ;
174+ }
175+ } )
176+ } else {
177+ None
175178 }
176179 } ;
177180
@@ -180,12 +183,6 @@ pub fn execution_stub_result_page(
180183 . as_ref ( )
181184 . map ( |wit| wit_highlighter:: print_interface_with_single_fn ( wit, ffqn) ) ;
182185
183- let wit_type = fn_detail
184- . return_type
185- . as_ref ( )
186- . expect ( "TODO" )
187- . wit_type
188- . as_str ( ) ;
189186 html ! { <>
190187 <header>
191188 <h1>{ "Stub execution result" } </h1>
@@ -202,10 +199,14 @@ pub fn execution_stub_result_page(
202199 </h3>
203200 </header>
204201 <form id="execution-stub-result-form" onsubmit = { on_submit } >
205- <p>
206- <label for ="input" >{ wit_type} </label>
207- <input id="input" type ="text" ref={ input_state. deref( ) } oninput = { oninput} />
208- </p>
202+ if let Some ( return_type) = maybe_return_type {
203+ <p>
204+ <label for ="input" >{ return_type. wit_type. as_str( ) } </label>
205+ <input id="input" type ="text" ref={ input_ref. clone( ) } oninput = { oninput} />
206+ </p>
207+ } else {
208+ <p>{ "(no return value)" } </p>
209+ }
209210 <button type ="submit" disabled={ * request_processing_state} >
210211 { "Submit response" }
211212 </button>
@@ -220,18 +221,10 @@ pub fn execution_stub_result_page(
220221 </>}
221222}
222223
223- fn validate_response (
224- function_detail : & grpc_client:: FunctionDetail ,
225- value : & str ,
226- ) -> Result < ( ) , String > {
224+ fn validate_response ( return_type : & grpc_client:: WitType , value : & str ) -> Result < ( ) , String > {
227225 match serde_json:: from_str :: < serde_json:: Value > ( value) {
228226 Ok ( value) => {
229- let type_wrapper = function_detail
230- . return_type
231- . as_ref ( )
232- . expect ( "TODO" )
233- . type_wrapper
234- . as_str ( ) ;
227+ let type_wrapper = return_type. type_wrapper . as_str ( ) ;
235228 let type_and_value_json = format ! ( "{{\" type\" : {type_wrapper}, \" value\" : {value}}}" ) ;
236229 match serde_json:: from_str :: < WastValWithType > ( & type_and_value_json) {
237230 Ok ( _) => Ok ( ( ) ) ,
0 commit comments