| 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( |