| 295 | } |
| 296 | |
| 297 | fn handle_result_call( |
| 298 | &mut self, |
| 299 | func: &&wit_parser::Function, |
| 300 | target: String, |
| 301 | func_name: String, |
| 302 | oper: String, |
| 303 | use_await: bool, |
| 304 | ) -> String { |
| 305 | let ret = self.locals.tmp("ret"); |
| 306 | if self.interface_gen.csharp_gen.opts.with_wit_results { |
| 307 | uwriteln!(self.src, "var {ret} = {target}.{func_name}({oper});"); |
| 308 | return ret; |
| 309 | } |
| 310 | |
| 311 | // otherwise generate exception code |
| 312 | let ty = self |
| 313 | .interface_gen |
| 314 | .type_name_with_qualifier(&func.result.unwrap(), true); |
| 315 | let is_async = InterfaceGenerator::is_async(&func.kind); |
| 316 | |
| 317 | if is_async && !use_await { |
| 318 | uwriteln!(self.src, "Task<{ty}> {ret};"); |
| 319 | } else { |
| 320 | uwriteln!(self.src, "{ty} {ret};"); |
| 321 | } |
| 322 | let mut cases = Vec::with_capacity(self.results.len()); |
| 323 | let mut oks = Vec::with_capacity(self.results.len()); |
| 324 | let mut payload_is_void = false; |
| 325 | for (index, ty) in self.results.iter().enumerate() { |
| 326 | let TypeDefKind::Result(result) = &self.interface_gen.resolve.types[*ty].kind else { |
| 327 | unreachable!(); |
| 328 | }; |
| 329 | let err_ty = if let Some(ty) = result.err { |
| 330 | self.interface_gen.type_name_with_qualifier(&ty, true) |
| 331 | } else { |
| 332 | "None".to_owned() |
| 333 | }; |
| 334 | let ty = self |
| 335 | .interface_gen |
| 336 | .type_name_with_qualifier(&Type::Id(*ty), true); |
| 337 | let head = oks.concat(); |
| 338 | let tail = oks.iter().map(|_| ")").collect::<Vec<_>>().concat(); |
| 339 | cases.push(format!( |
| 340 | "\ |
| 341 | case {index}: |
| 342 | {{ |
| 343 | ret = {head}{ty}.Err(({err_ty}) e.Value){tail}; |
| 344 | break; |
| 345 | }} |
| 346 | " |
| 347 | )); |
| 348 | oks.push(format!("{ty}.Ok(")); |
| 349 | payload_is_void = result.ok.is_none(); |
| 350 | } |
| 351 | if !self.results.is_empty() { |
| 352 | self.src.push_str( |
| 353 | " |
| 354 | try |