MCPcopy Create free account
hub / github.com/bytecodealliance/wit-bindgen / handle_result_import

Method handle_result_import

crates/csharp/src/function.rs:240–295  ·  view source on GitHub ↗
(&mut self, operands: &mut Vec<String>)

Source from the content-addressed store, hash-verified

238 }
239
240 fn handle_result_import(&mut self, operands: &mut Vec<String>) {
241 if self.interface_gen.csharp_gen.opts.with_wit_results {
242 uwriteln!(self.src, "return {};", operands[0]);
243 return;
244 }
245
246 let mut payload_is_void = false;
247 let mut previous = operands[0].clone();
248 let mut vars: Vec<(String, Option<String>)> = Vec::with_capacity(self.results.len());
249 if let Direction::Import = self.interface_gen.direction {
250 for ty in &self.results {
251 let tmp = self.locals.tmp("tmp");
252 uwrite!(
253 self.src,
254 "\
255 if ({previous}.IsOk)
256 {{
257 var {tmp} = {previous}.AsOk;
258 "
259 );
260 let TypeDefKind::Result(result) = &self.interface_gen.resolve.types[*ty].kind
261 else {
262 unreachable!();
263 };
264 let exception_name = result
265 .err
266 .map(|ty| self.interface_gen.type_name_with_qualifier(&ty, true));
267 vars.push((previous.clone(), exception_name));
268 payload_is_void = result.ok.is_none();
269 previous = tmp;
270 }
271 }
272 uwriteln!(
273 self.src,
274 "return {};",
275 if payload_is_void { "" } else { &previous }
276 );
277 for (level, var) in vars.iter().enumerate().rev() {
278 self.interface_gen.csharp_gen.needs_wit_exception = true;
279 let (var_name, exception_name) = var;
280 let exception_name = match exception_name {
281 Some(type_name) => &format!("WitException<{type_name}>"),
282 None => "WitException",
283 };
284 uwrite!(
285 self.src,
286 "\
287 }}
288 else
289 {{
290 throw new {exception_name}({var_name}.AsErr!, {level});
291 }}
292 "
293 );
294 }
295 }
296
297 fn handle_result_call(

Callers 1

emitMethod · 0.80

Calls 5

mapMethod · 0.80
tmpMethod · 0.45
pushMethod · 0.45
iterMethod · 0.45

Tested by

no test coverage detected