| 631 | } |
| 632 | |
| 633 | fn export(&mut self, resolve: &Resolve, name: &WorldKey, item: &WorldItem) { |
| 634 | let wt = self.wasmtime_path(); |
| 635 | let mut generator = InterfaceGenerator::new(self, resolve); |
| 636 | let field; |
| 637 | let ty; |
| 638 | let ty_index; |
| 639 | let load; |
| 640 | let get_index; |
| 641 | match item { |
| 642 | WorldItem::Function(func) => { |
| 643 | generator.define_rust_guest_export(resolve, None, func); |
| 644 | let body = mem::take(&mut generator.src).into(); |
| 645 | load = generator.extract_typed_function(func).1; |
| 646 | assert!(generator.src.is_empty()); |
| 647 | generator.generator.exports.funcs.push(body); |
| 648 | ty_index = format!("{wt}::component::ComponentExportIndex"); |
| 649 | field = func_field_name(resolve, func); |
| 650 | ty = format!("{wt}::component::Func"); |
| 651 | let sig = generator.typedfunc_sig(func, TypeMode::AllBorrowed("'_")); |
| 652 | let typecheck = format!( |
| 653 | "match item {{ |
| 654 | {wt}::component::types::ComponentItem::ComponentFunc(func) => {{ |
| 655 | {wt}::error::Context::context( |
| 656 | func.typecheck::<{sig}>(&_instance_type), |
| 657 | \"type-checking export func `{0}`\" |
| 658 | )?; |
| 659 | index |
| 660 | }} |
| 661 | _ => Err({wt}::format_err!(\"export `{0}` is not a function\"))?, |
| 662 | }}", |
| 663 | func.name |
| 664 | ); |
| 665 | get_index = format!( |
| 666 | "{{ let (item, index) = _component.get_export(None, \"{}\") |
| 667 | .ok_or_else(|| {wt}::format_err!(\"no export `{0}` found\"))?; |
| 668 | {typecheck} |
| 669 | }}", |
| 670 | func.name |
| 671 | ); |
| 672 | } |
| 673 | WorldItem::Type { .. } => unreachable!(), |
| 674 | WorldItem::Interface { id, .. } => { |
| 675 | generator |
| 676 | .generator |
| 677 | .name_interface(resolve, *id, name, InterfaceKind::Export); |
| 678 | generator.current_interface = Some((*id, name, InterfaceKind::Export)); |
| 679 | generator.types(*id); |
| 680 | let struct_name = "Guest"; |
| 681 | let iface = &resolve.interfaces[*id]; |
| 682 | let iface_name = match name { |
| 683 | WorldKey::Name(name) => name, |
| 684 | WorldKey::Interface(_) => iface.name.as_ref().unwrap(), |
| 685 | }; |
| 686 | uwriteln!(generator.src, "#[derive(Clone)]"); |
| 687 | uwriteln!(generator.src, "pub struct {struct_name} {{"); |
| 688 | for (_, func) in iface.functions.iter() { |
| 689 | uwriteln!( |
| 690 | generator.src, |