1use crate::*;
2use alloc::string::{String, ToString};
3use alloc::vec;
4use alloc::vec::Vec;
5use anyhow::Result;
6use anyhow::{Context, anyhow, bail};
7use core::mem;
8use std::io::Read;
9use wasmparser::Chunk;
10use wasmparser::{
11 ComponentExternalKind, Parser, Payload, PrimitiveValType, ValidPayload, Validator,
12 WasmFeatures,
13 component_types::{
14 ComponentAnyTypeId, ComponentDefinedType, ComponentEntityType, ComponentItem,
15 ComponentType, ComponentValType,
16 },
17 names::{ComponentName, ComponentNameKind},
18 types,
19 types::Types,
20};
21
22struct ComponentInfo {
24 types: types::Types,
27 externs: Vec<(String, Extern)>,
29 package_metadata: Option<PackageMetadata>,
31}
32
33enum Extern {
34 Import(ComponentItem),
35 Export(ComponentItem),
36}
37
38#[derive(Debug, Clone, Copy, PartialEq, Eq)]
39enum WitEncodingVersion {
40 V1,
41 V2,
42}
43
44impl ComponentInfo {
45 fn from_reader(mut reader: impl Read) -> Result<Self> {
47 let mut validator = Validator::new_with_features(WasmFeatures::all());
48 let mut externs = Vec::new();
49 let mut depth = 1;
50 let mut types = None;
51 let mut _package_metadata = None;
52 let mut cur = Parser::new(0);
53 let mut eof = false;
54 let mut stack = Vec::new();
55 let mut buffer = Vec::new();
56
57 loop {
58 let chunk = cur.parse(&buffer, eof)?;
59 let (payload, consumed) = match chunk {
60 Chunk::NeedMoreData(hint) => {
61 assert!(!eof); let len = buffer.len();
69 buffer.extend((0..hint).map(|_| 0u8));
70 let n = reader.read(&mut buffer[len..])?;
71 buffer.truncate(len + n);
72 eof = n == 0;
73 continue;
74 }
75
76 Chunk::Parsed { consumed, payload } => (payload, consumed),
77 };
78 match validator.payload(&payload)? {
79 ValidPayload::Ok => {}
80 ValidPayload::Parser(_) => depth += 1,
81 ValidPayload::End(t) => {
82 depth -= 1;
83 if depth == 0 {
84 types = Some(t);
85 }
86 }
87 ValidPayload::Func(..) => {}
88 }
89
90 match payload {
91 Payload::ComponentImportSection(s) if depth == 1 => {
92 for import in s {
93 let import = import?;
94 let ty = validator
95 .types(0)
96 .unwrap()
97 .component_item_for_import(import.name.name)
98 .unwrap();
99 externs.push((import.name.name.to_string(), Extern::Import(ty.clone())));
100 }
101 }
102 Payload::ComponentExportSection(s) if depth == 1 => {
103 for export in s {
104 let export = export?;
105 let ty = validator
106 .types(0)
107 .unwrap()
108 .component_item_for_export(export.name.name)
109 .unwrap();
110 externs.push((export.name.name.to_string(), Extern::Export(ty.clone())));
111 }
112 }
113 #[cfg(feature = "serde")]
114 Payload::CustomSection(s) if s.name() == PackageMetadata::SECTION_NAME => {
115 if _package_metadata.is_some() {
116 bail!("multiple {:?} sections", PackageMetadata::SECTION_NAME);
117 }
118 _package_metadata = Some(PackageMetadata::decode(s.data())?);
119 }
120 Payload::ModuleSection { parser, .. }
121 | Payload::ComponentSection { parser, .. } => {
122 stack.push(cur.clone());
123 cur = parser.clone();
124 }
125 Payload::End(_) => {
126 if let Some(parent_parser) = stack.pop() {
127 cur = parent_parser.clone();
128 } else {
129 break;
130 }
131 }
132 _ => {}
133 }
134
135 buffer.drain(..consumed);
138 }
139
140 Ok(Self {
141 types: types.unwrap(),
142 externs,
143 package_metadata: _package_metadata,
144 })
145 }
146
147 fn is_wit_package(&self) -> Option<WitEncodingVersion> {
148 if self.externs.is_empty() {
151 return None;
152 }
153
154 if !self.externs.iter().all(|(_, item)| {
155 let export = match item {
156 Extern::Export(e) => e,
157 _ => return false,
158 };
159 match export.ty {
160 ComponentEntityType::Type { created, .. } => {
161 matches!(created, ComponentAnyTypeId::Component(_))
162 }
163 _ => false,
164 }
165 }) {
166 return None;
167 }
168
169 match ComponentName::new(&self.externs[0].0, 0).ok()?.kind() {
174 ComponentNameKind::Interface(name) if name.interface().as_str() == "wit" => {
175 Some(WitEncodingVersion::V1)
176 }
177 ComponentNameKind::Label(_) => Some(WitEncodingVersion::V2),
178 _ => None,
179 }
180 }
181
182 fn decode_wit_v1_package(&self) -> Result<(Resolve, PackageId)> {
183 let mut decoder = WitPackageDecoder::new(&self.types);
184
185 let mut pkg = None;
186 for (name, item) in self.externs.iter() {
187 let export = match item {
188 Extern::Export(e) => e,
189 _ => unreachable!(),
190 };
191 if pkg.is_some() {
192 bail!("more than one top-level exported component type found");
193 }
194 let name = ComponentName::new(name, 0).unwrap();
195 pkg = Some(
196 decoder
197 .decode_v1_package(&name, export)
198 .with_context(|| format!("failed to decode document `{name}`"))?,
199 );
200 }
201
202 let pkg = pkg.ok_or_else(|| anyhow!("no exported component type found"))?;
203 let (mut resolve, package) = decoder.finish(pkg);
204 if let Some(package_metadata) = &self.package_metadata {
205 package_metadata.inject(&mut resolve, package)?;
206 }
207 Ok((resolve, package))
208 }
209
210 fn decode_wit_v2_package(&self) -> Result<(Resolve, PackageId)> {
211 let mut decoder = WitPackageDecoder::new(&self.types);
212
213 let mut pkg_name = None;
214
215 let mut interfaces = IndexMap::default();
216 let mut worlds = IndexMap::default();
217 let mut fields = PackageFields {
218 interfaces: &mut interfaces,
219 worlds: &mut worlds,
220 };
221
222 for (_, item) in self.externs.iter() {
223 let export = match item {
224 Extern::Export(e) => e,
225 _ => unreachable!(),
226 };
227 let component = match export.ty {
228 ComponentEntityType::Type {
229 created: ComponentAnyTypeId::Component(id),
230 ..
231 } => &self.types[id],
232 _ => unreachable!(),
233 };
234
235 if component.exports.len() != 1 {
238 bail!(
239 "Expected a single export, but found {} instead",
240 component.exports.len()
241 );
242 }
243
244 let name = component.exports.keys().nth(0).unwrap();
245
246 let item = &component.exports[name];
247 let name = match item.ty {
248 ComponentEntityType::Component(_) => {
249 let package_name = decoder.decode_world(name.as_str(), item, &mut fields)?;
250 package_name
251 }
252 ComponentEntityType::Instance(_) => {
253 let package_name = decoder.decode_interface(
254 name.as_str(),
255 &component.imports,
256 item,
257 &mut fields,
258 )?;
259 package_name
260 }
261 _ => unreachable!(),
262 };
263
264 if let Some(pkg_name) = pkg_name.as_ref() {
265 if pkg_name != &name {
268 bail!("item defined with mismatched package name")
269 }
270 } else {
271 pkg_name.replace(name);
272 }
273 }
274
275 let pkg = if let Some(name) = pkg_name {
276 Package {
277 name,
278 docs: Docs::default(),
279 interfaces,
280 worlds,
281 }
282 } else {
283 bail!("no exported component type found");
284 };
285
286 let (mut resolve, package) = decoder.finish(pkg);
287 if let Some(package_metadata) = &self.package_metadata {
288 package_metadata.inject(&mut resolve, package)?;
289 }
290 Ok((resolve, package))
291 }
292
293 fn decode_component(&self) -> Result<(Resolve, WorldId)> {
294 assert!(self.is_wit_package().is_none());
295 let mut decoder = WitPackageDecoder::new(&self.types);
296 let world_name = "root";
300 let world = decoder.resolve.worlds.alloc(World {
301 name: world_name.to_string(),
302 docs: Default::default(),
303 imports: Default::default(),
304 exports: Default::default(),
305 package: None,
306 includes: Default::default(),
307 stability: Default::default(),
308 span: Default::default(),
309 });
310 let mut package = Package {
311 name: PackageName {
315 namespace: "root".to_string(),
316 version: None,
317 name: "component".to_string(),
318 },
319 docs: Default::default(),
320 worlds: [(world_name.to_string(), world)].into_iter().collect(),
321 interfaces: Default::default(),
322 };
323
324 let mut fields = PackageFields {
325 worlds: &mut package.worlds,
326 interfaces: &mut package.interfaces,
327 };
328
329 for (name, item) in self.externs.iter() {
330 match item {
331 Extern::Import(i) => {
332 decoder.decode_component_import(name, i, world, &mut fields)?
333 }
334 Extern::Export(e) => {
335 decoder.decode_component_export(name, e, world, &mut fields)?
336 }
337 }
338 }
339
340 let (mut resolve, pkg) = decoder.finish(package);
341 if let Some(package_metadata) = &self.package_metadata {
342 package_metadata.inject(&mut resolve, pkg)?;
343 }
344 Ok((resolve, world))
345 }
346}
347
348pub enum DecodedWasm {
350 WitPackage(Resolve, PackageId),
356
357 Component(Resolve, WorldId),
360}
361
362impl DecodedWasm {
363 pub fn resolve(&self) -> &Resolve {
365 match self {
366 DecodedWasm::WitPackage(resolve, _) => resolve,
367 DecodedWasm::Component(resolve, _) => resolve,
368 }
369 }
370
371 pub fn package(&self) -> PackageId {
373 match self {
374 DecodedWasm::WitPackage(_, id) => *id,
375 DecodedWasm::Component(resolve, world) => resolve.worlds[*world].package.unwrap(),
376 }
377 }
378}
379
380pub fn decode_reader(reader: impl Read) -> Result<DecodedWasm> {
382 let info = ComponentInfo::from_reader(reader)?;
383
384 if let Some(version) = info.is_wit_package() {
385 match version {
386 WitEncodingVersion::V1 => {
387 log::debug!("decoding a v1 WIT package encoded as wasm");
388 let (resolve, pkg) = info.decode_wit_v1_package()?;
389 Ok(DecodedWasm::WitPackage(resolve, pkg))
390 }
391 WitEncodingVersion::V2 => {
392 log::debug!("decoding a v2 WIT package encoded as wasm");
393 let (resolve, pkg) = info.decode_wit_v2_package()?;
394 Ok(DecodedWasm::WitPackage(resolve, pkg))
395 }
396 }
397 } else {
398 log::debug!("inferring the WIT of a concrete component");
399 let (resolve, world) = info.decode_component()?;
400 Ok(DecodedWasm::Component(resolve, world))
401 }
402}
403
404pub fn decode(bytes: &[u8]) -> Result<DecodedWasm> {
411 decode_reader(bytes)
412}
413
414pub fn decode_world(wasm: &[u8]) -> Result<(Resolve, WorldId)> {
422 let mut validator = Validator::new_with_features(WasmFeatures::all());
423 let mut exports = Vec::new();
424 let mut depth = 1;
425 let mut types = None;
426
427 for payload in Parser::new(0).parse_all(wasm) {
428 let payload = payload?;
429
430 match validator.payload(&payload)? {
431 ValidPayload::Ok => {}
432 ValidPayload::Parser(_) => depth += 1,
433 ValidPayload::End(t) => {
434 depth -= 1;
435 if depth == 0 {
436 types = Some(t);
437 }
438 }
439 ValidPayload::Func(..) => {}
440 }
441
442 match payload {
443 Payload::ComponentExportSection(s) if depth == 1 => {
444 for export in s {
445 exports.push(export?);
446 }
447 }
448 _ => {}
449 }
450 }
451
452 if exports.len() != 1 {
453 bail!("expected one export in component");
454 }
455 if exports[0].kind != ComponentExternalKind::Type {
456 bail!("expected an export of a type");
457 }
458 if exports[0].ty.is_some() {
459 bail!("expected an un-ascribed exported type");
460 }
461 let types = types.as_ref().unwrap();
462 let world = match types.as_ref().component_any_type_at(exports[0].index) {
463 ComponentAnyTypeId::Component(c) => c,
464 _ => bail!("expected an exported component type"),
465 };
466
467 let mut decoder = WitPackageDecoder::new(types);
468 let mut interfaces = IndexMap::default();
469 let mut worlds = IndexMap::default();
470 let ty = &types[world];
471 assert_eq!(ty.imports.len(), 0);
472 assert_eq!(ty.exports.len(), 1);
473 let name = ty.exports.keys().nth(0).unwrap();
474 let name = decoder.decode_world(
475 name,
476 &ty.exports[0],
477 &mut PackageFields {
478 interfaces: &mut interfaces,
479 worlds: &mut worlds,
480 },
481 )?;
482 let (resolve, pkg) = decoder.finish(Package {
483 name,
484 interfaces,
485 worlds,
486 docs: Default::default(),
487 });
488 let world = *resolve.packages[pkg].worlds.iter().next().unwrap().1;
491 Ok((resolve, world))
492}
493
494struct PackageFields<'a> {
495 interfaces: &'a mut IndexMap<String, InterfaceId>,
496 worlds: &'a mut IndexMap<String, WorldId>,
497}
498
499struct WitPackageDecoder<'a> {
500 resolve: Resolve,
501 types: &'a Types,
502 foreign_packages: IndexMap<String, Package>,
503 iface_to_package_index: HashMap<InterfaceId, usize>,
504 named_interfaces: HashMap<String, InterfaceId>,
505
506 resources: HashMap<TypeOwner, HashMap<String, TypeId>>,
514
515 type_map: HashMap<ComponentAnyTypeId, TypeId>,
517}
518
519impl WitPackageDecoder<'_> {
520 fn new<'a>(types: &'a Types) -> WitPackageDecoder<'a> {
521 WitPackageDecoder {
522 resolve: Resolve::default(),
523 types,
524 type_map: HashMap::new(),
525 foreign_packages: Default::default(),
526 iface_to_package_index: Default::default(),
527 named_interfaces: Default::default(),
528 resources: Default::default(),
529 }
530 }
531
532 fn decode_v1_package(&mut self, name: &ComponentName, item: &ComponentItem) -> Result<Package> {
533 let ty = match item.ty {
534 ComponentEntityType::Type {
535 created: ComponentAnyTypeId::Component(id),
536 ..
537 } => &self.types[id],
538 _ => unreachable!(),
539 };
540
541 for (name, item) in ty.imports.iter() {
544 self.register_import(name, item)
545 .with_context(|| format!("failed to process import `{name}`"))?;
546 }
547
548 let mut package = Package {
549 name: match name.kind() {
553 ComponentNameKind::Interface(name) if name.interface().as_str() == "wit" => {
554 name.to_package_name(item)?
555 }
556 _ => bail!("package name is not a valid id: {name}"),
557 },
558 docs: Default::default(),
559 interfaces: Default::default(),
560 worlds: Default::default(),
561 };
562
563 let mut fields = PackageFields {
564 interfaces: &mut package.interfaces,
565 worlds: &mut package.worlds,
566 };
567
568 for (name, ty) in ty.exports.iter() {
569 match ty.ty {
570 ComponentEntityType::Instance(_) => {
571 self.register_interface(name.as_str(), ty, &mut fields)
572 .with_context(|| format!("failed to process export `{name}`"))?;
573 }
574 ComponentEntityType::Component(idx) => {
575 let ty = &self.types[idx];
576 self.register_world(name.as_str(), ty, &mut fields)
577 .with_context(|| format!("failed to process export `{name}`"))?;
578 }
579 _ => bail!("component export `{name}` is not an instance or component"),
580 }
581 }
582 Ok(package)
583 }
584
585 fn decode_interface<'a>(
586 &mut self,
587 name: &str,
588 imports: &wasmparser::collections::IndexMap<String, ComponentItem>,
589 item: &ComponentItem,
590 fields: &mut PackageFields<'a>,
591 ) -> Result<PackageName> {
592 let component_name = self
593 .parse_component_name(name)
594 .context("expected world name to have an ID form")?;
595
596 let package = match component_name.kind() {
597 ComponentNameKind::Interface(name) => name.to_package_name(item)?,
598 _ => bail!("expected world name to be fully qualified"),
599 };
600
601 for (name, ty) in imports.iter() {
602 self.register_import(name, ty)
603 .with_context(|| format!("failed to process import `{name}`"))?;
604 }
605
606 let _ = self.register_interface(name, item, fields)?;
607
608 Ok(package)
609 }
610
611 fn decode_world<'a>(
612 &mut self,
613 name: &str,
614 item: &ComponentItem,
615 fields: &mut PackageFields<'a>,
616 ) -> Result<PackageName> {
617 let ty = match item.ty {
618 ComponentEntityType::Component(ty) => &self.types[ty],
619 _ => unreachable!(),
620 };
621 let kebab_name = self
622 .parse_component_name(name)
623 .context("expected world name to have an ID form")?;
624
625 let package = match kebab_name.kind() {
626 ComponentNameKind::Interface(name) => name.to_package_name(item)?,
627 _ => bail!("expected world name to be fully qualified"),
628 };
629
630 let _ = self.register_world(name, ty, fields)?;
631
632 Ok(package)
633 }
634
635 fn decode_component_import<'a>(
636 &mut self,
637 name: &str,
638 item: &ComponentItem,
639 world: WorldId,
640 package: &mut PackageFields<'a>,
641 ) -> Result<()> {
642 log::debug!("decoding component import `{name}`");
643 let owner = TypeOwner::World(world);
644 let (name, item) = match item.ty {
645 ComponentEntityType::Instance(_) => self
646 .decode_world_instance(name, item, package)
647 .with_context(|| format!("failed to decode WIT from import `{name}`"))?,
648 ComponentEntityType::Func(_) => {
649 let func = self
650 .convert_function(name, item, owner)
651 .with_context(|| format!("failed to decode function from import `{name}`"))?;
652 (WorldKey::Name(name.to_string()), WorldItem::Function(func))
653 }
654 ComponentEntityType::Type { .. } => {
655 let id = self
656 .register_type_export(name, item, owner)
657 .with_context(|| format!("failed to decode type from export `{name}`"))?;
658 (
659 WorldKey::Name(name.to_string()),
660 WorldItem::Type {
661 id,
662 span: Default::default(),
663 },
664 )
665 }
666 _ => return Ok(()),
668 };
669 self.resolve.worlds[world].imports.insert(name, item);
670 Ok(())
671 }
672
673 fn decode_component_export<'a>(
674 &mut self,
675 name: &str,
676 item: &ComponentItem,
677 world: WorldId,
678 package: &mut PackageFields<'a>,
679 ) -> Result<()> {
680 log::debug!("decoding component export `{name}`");
681 let (name, item) = match item.ty {
682 ComponentEntityType::Func(_) => {
683 let func = self
684 .convert_function(name, item, TypeOwner::World(world))
685 .with_context(|| format!("failed to decode function from export `{name}`"))?;
686
687 (WorldKey::Name(name.to_string()), WorldItem::Function(func))
688 }
689 ComponentEntityType::Instance(_) => self
690 .decode_world_instance(name, item, package)
691 .with_context(|| format!("failed to decode WIT from export `{name}`"))?,
692 _ => {
693 bail!("component export `{name}` was not a function or instance")
694 }
695 };
696 self.resolve.worlds[world].exports.insert(name, item);
697 Ok(())
698 }
699
700 fn decode_world_instance<'a>(
709 &mut self,
710 name: &str,
711 item: &ComponentItem,
712 package: &mut PackageFields<'a>,
713 ) -> Result<(WorldKey, WorldItem)> {
714 let (key, id) = match &item.implements {
715 Some(i) => {
716 let id = self.register_import(i, item)?;
717 (WorldKey::Name(name.to_string()), id)
718 }
719 None => match self.parse_component_name(name)?.kind() {
720 ComponentNameKind::Interface(i) => {
721 let id = self.register_import(i.as_str(), item)?;
722 (WorldKey::Interface(id), id)
723 }
724 _ => self.register_interface(name, item, package)?,
725 },
726 };
727 Ok((
728 key,
729 WorldItem::Interface {
730 id,
731 stability: Default::default(),
732 docs: Default::default(),
733 span: Default::default(),
734 external_id: item.external_id.clone(),
735 },
736 ))
737 }
738
739 fn register_import(&mut self, name: &str, item: &ComponentItem) -> Result<InterfaceId> {
749 let ty = match item.ty {
750 ComponentEntityType::Instance(idx) => &self.types[idx],
751 _ => bail!("import `{name}` is not an instance"),
752 };
753 let (is_local, interface) = match self.named_interfaces.get(name) {
754 Some(id) => (true, *id),
755 None => (false, self.extract_dep_interface(name, item)?),
756 };
757 let owner = TypeOwner::Interface(interface);
758 for (name, item) in ty.exports.iter() {
759 log::debug!("decoding import instance export `{name}`");
760 match item.ty {
761 ComponentEntityType::Type {
762 referenced,
763 created,
764 } => {
765 match self.resolve.interfaces[interface]
766 .types
767 .get(name.as_str())
768 .copied()
769 {
770 Some(id) => {
788 log::debug!("type already exist");
789 match referenced {
790 ComponentAnyTypeId::Defined(ty) => {
791 self.register_defined(id, &self.types[ty])?;
792 }
793 ComponentAnyTypeId::Resource(_) => {}
794 _ => unreachable!(),
795 }
796 let prev = self.type_map.insert(created, id);
797 assert!(prev.is_none());
798 }
799
800 None => {
814 if is_local {
815 bail!("instance type export `{name}` not defined in interface");
816 }
817 let id = self.register_type_export(name.as_str(), item, owner)?;
818 let prev = self.resolve.interfaces[interface]
819 .types
820 .insert(name.to_string(), id);
821 assert!(prev.is_none());
822 }
823 }
824 }
825
826 ComponentEntityType::Func(_) => {
830 if self.resolve.interfaces[interface]
831 .functions
832 .contains_key(name.as_str())
833 {
834 continue;
837 }
838 if is_local {
839 bail!("instance function export `{name}` not defined in interface");
840 }
841 let func = self.convert_function(name.as_str(), item, owner)?;
842 let prev = self.resolve.interfaces[interface]
843 .functions
844 .insert(name.to_string(), func);
845 assert!(prev.is_none());
846 }
847
848 _ => bail!("instance type export `{name}` is not a type"),
849 }
850 }
851
852 Ok(interface)
853 }
854
855 fn find_alias(&self, id: ComponentAnyTypeId) -> Option<TypeId> {
856 let mut prev = None;
863 let mut cur = id;
864 while prev.is_none() {
865 prev = self.type_map.get(&cur).copied();
866 cur = match self.types.as_ref().peel_alias(cur) {
867 Some(next) => next,
868 None => break,
869 };
870 }
871 prev
872 }
873
874 fn extract_dep_interface(
877 &mut self,
878 name_string: &str,
879 item: &ComponentItem,
880 ) -> Result<InterfaceId> {
881 let name = ComponentName::new(name_string, 0).unwrap();
882 let name = match name.kind() {
883 ComponentNameKind::Interface(name) => name,
884 _ => bail!("package name is not a valid id: {name_string}"),
885 };
886 let package_name = name.to_package_name(item)?;
887 let package = self
889 .foreign_packages
890 .entry(package_name.to_string())
891 .or_insert_with(|| Package {
892 name: package_name.clone(),
893 docs: Default::default(),
894 interfaces: Default::default(),
895 worlds: Default::default(),
896 });
897 let interface = *package
898 .interfaces
899 .entry(name.interface().to_string())
900 .or_insert_with(|| {
901 self.resolve.interfaces.alloc(Interface {
902 name: Some(name.interface().to_string()),
903 docs: Default::default(),
904 types: IndexMap::default(),
905 functions: IndexMap::default(),
906 package: None,
907 stability: Default::default(),
908 span: Default::default(),
909 clone_of: None,
910 })
911 });
912
913 self.iface_to_package_index.insert(
915 interface,
916 self.foreign_packages
917 .get_full(&package_name.to_string())
918 .unwrap()
919 .0,
920 );
921 Ok(interface)
922 }
923
924 fn register_interface<'a>(
940 &mut self,
941 name: &str,
942 item: &ComponentItem,
943 package: &mut PackageFields<'a>,
944 ) -> Result<(WorldKey, InterfaceId)> {
945 let ty = match item.ty {
946 ComponentEntityType::Instance(i) => &self.types[i],
947 _ => unreachable!(),
948 };
949 if self.named_interfaces.contains_key(name) {
953 let id = self.register_import(name, item)?;
954 return Ok((WorldKey::Interface(id), id));
955 }
956
957 let interface_name = self.extract_interface_name_from_component_name(name)?;
961
962 let mut interface = Interface {
963 name: interface_name.clone(),
964 docs: Default::default(),
965 types: IndexMap::default(),
966 functions: IndexMap::default(),
967 package: None,
968 stability: Default::default(),
969 span: Default::default(),
970 clone_of: None,
971 };
972
973 let owner = TypeOwner::Interface(self.resolve.interfaces.next_id());
974 for (name, item) in ty.exports.iter() {
975 match item.ty {
976 ComponentEntityType::Type { .. } => {
977 let ty = self
978 .register_type_export(name.as_str(), item, owner)
979 .with_context(|| format!("failed to register type export '{name}'"))?;
980 let prev = interface.types.insert(name.to_string(), ty);
981 assert!(prev.is_none());
982 }
983
984 ComponentEntityType::Func(_) => {
985 let func = self
986 .convert_function(name.as_str(), item, owner)
987 .with_context(|| format!("failed to convert function '{name}'"))?;
988 let prev = interface.functions.insert(name.to_string(), func);
989 assert!(prev.is_none());
990 }
991 _ => bail!("instance type export `{name}` is not a type or function"),
992 };
993 }
994 let id = self.resolve.interfaces.alloc(interface);
995 let key = match interface_name {
996 Some(interface_name) => {
1000 let prev = package.interfaces.insert(interface_name, id);
1001 assert!(prev.is_none(), "duplicate interface added for {name:?}");
1002 let prev = self.named_interfaces.insert(name.to_string(), id);
1003 assert!(prev.is_none());
1004 WorldKey::Interface(id)
1005 }
1006
1007 None => WorldKey::Name(name.to_string()),
1010 };
1011 Ok((key, id))
1012 }
1013
1014 fn parse_component_name(&self, name: &str) -> Result<ComponentName> {
1015 ComponentName::new(name, 0)
1016 .with_context(|| format!("cannot extract item name from: {name}"))
1017 }
1018
1019 fn extract_interface_name_from_component_name(&self, name: &str) -> Result<Option<String>> {
1020 let component_name = self.parse_component_name(name)?;
1021 match component_name.kind() {
1022 ComponentNameKind::Interface(name) => Ok(Some(name.interface().to_string())),
1023 ComponentNameKind::Label(_name) => Ok(None),
1024 _ => bail!("cannot extract item name from: {name}"),
1025 }
1026 }
1027
1028 fn register_type_export(
1029 &mut self,
1030 name: &str,
1031 item: &ComponentItem,
1032 owner: TypeOwner,
1033 ) -> Result<TypeId> {
1034 let (referenced, created) = match item.ty {
1035 ComponentEntityType::Type {
1036 referenced,
1037 created,
1038 } => (referenced, created),
1039 _ => unreachable!(),
1040 };
1041 let kind = match self.find_alias(referenced) {
1042 Some(prev) => {
1046 log::debug!("type export for `{name}` is an alias");
1047 TypeDefKind::Type(Type::Id(prev))
1048 }
1049
1050 None => {
1053 log::debug!("type export for `{name}` is a new type");
1054 match referenced {
1055 ComponentAnyTypeId::Defined(ty) => self
1056 .convert_defined(&self.types[ty])
1057 .context("failed to convert unaliased type")?,
1058 ComponentAnyTypeId::Resource(_) => TypeDefKind::Resource,
1059 _ => unreachable!(),
1060 }
1061 }
1062 };
1063 let ty = self.resolve.types.alloc(TypeDef {
1064 name: Some(name.to_string()),
1065 kind,
1066 docs: Default::default(),
1067 stability: Default::default(),
1068 owner,
1069 span: Default::default(),
1070 external_id: item.external_id.clone(),
1071 });
1072
1073 if let TypeDefKind::Resource = self.resolve.types[ty].kind {
1077 let prev = self
1078 .resources
1079 .entry(owner)
1080 .or_insert(HashMap::new())
1081 .insert(name.to_string(), ty);
1082 assert!(prev.is_none());
1083 }
1084
1085 let prev = self.type_map.insert(created, ty);
1089 if prev.is_some() {
1090 bail!(
1091 "cannot represent this component in WIT: the type `{name}` appears \
1092 more than once (for example, when an imported instance is \
1093 re-exported under a new name)"
1094 );
1095 }
1096 Ok(ty)
1097 }
1098
1099 fn register_world<'a>(
1100 &mut self,
1101 name: &str,
1102 ty: &ComponentType,
1103 package: &mut PackageFields<'a>,
1104 ) -> Result<WorldId> {
1105 let name = self
1106 .extract_interface_name_from_component_name(name)?
1107 .context("expected world name to have an ID form")?;
1108 let mut world = World {
1109 name: name.clone(),
1110 docs: Default::default(),
1111 imports: Default::default(),
1112 exports: Default::default(),
1113 includes: Default::default(),
1114 package: None,
1115 stability: Default::default(),
1116 span: Default::default(),
1117 };
1118
1119 let owner = TypeOwner::World(self.resolve.worlds.next_id());
1120 for (name, item) in ty.imports.iter() {
1121 let (name, item) = match item.ty {
1122 ComponentEntityType::Instance(_) => {
1123 self.decode_world_instance(name, item, package)?
1124 }
1125 ComponentEntityType::Type { .. } => {
1126 let ty = self.register_type_export(name.as_str(), item, owner)?;
1127 (
1128 WorldKey::Name(name.to_string()),
1129 WorldItem::Type {
1130 id: ty,
1131 span: Default::default(),
1132 },
1133 )
1134 }
1135 ComponentEntityType::Func(_) => {
1136 let func = self.convert_function(name.as_str(), item, owner)?;
1137 (WorldKey::Name(name.to_string()), WorldItem::Function(func))
1138 }
1139 _ => bail!("component import `{name}` is not an instance, func, or type"),
1140 };
1141 world.imports.insert(name, item);
1142 }
1143
1144 for (name, item) in ty.exports.iter() {
1145 let (name, item) = match item.ty {
1146 ComponentEntityType::Instance(_) => {
1147 self.decode_world_instance(name, item, package)?
1148 }
1149
1150 ComponentEntityType::Func(_) => {
1151 let func = self.convert_function(name.as_str(), item, owner)?;
1152 (WorldKey::Name(name.to_string()), WorldItem::Function(func))
1153 }
1154
1155 _ => bail!("component export `{name}` is not an instance or function"),
1156 };
1157 world.exports.insert(name, item);
1158 }
1159 let id = self.resolve.worlds.alloc(world);
1160 let prev = package.worlds.insert(name, id);
1161 assert!(prev.is_none());
1162 Ok(id)
1163 }
1164
1165 fn convert_function(
1166 &mut self,
1167 name: &str,
1168 item: &ComponentItem,
1169 owner: TypeOwner,
1170 ) -> Result<Function> {
1171 let ty = match item.ty {
1172 ComponentEntityType::Func(i) => &self.types[i],
1173 _ => unreachable!(),
1174 };
1175 let name = ComponentName::new(name, 0).unwrap();
1176 let params = ty
1177 .params
1178 .iter()
1179 .map(|(name, ty)| {
1180 Ok(Param {
1181 name: name.to_string(),
1182 ty: self.convert_valtype(ty)?,
1183 span: Default::default(),
1184 })
1185 })
1186 .collect::<Result<Vec<_>>>()
1187 .context("failed to convert params")?;
1188 let result = match &ty.result {
1189 Some(ty) => Some(
1190 self.convert_valtype(ty)
1191 .context("failed to convert anonymous result type")?,
1192 ),
1193 None => None,
1194 };
1195 Ok(Function {
1196 docs: Default::default(),
1197 stability: Default::default(),
1198 external_id: item.external_id.clone(),
1199 kind: match name.kind() {
1200 ComponentNameKind::Label(_) => {
1201 if ty.async_ {
1202 FunctionKind::AsyncFreestanding
1203 } else {
1204 FunctionKind::Freestanding
1205 }
1206 }
1207 ComponentNameKind::Constructor(resource) => {
1208 FunctionKind::Constructor(self.resources[&owner][resource.as_str()])
1209 }
1210 ComponentNameKind::Method(name) => {
1211 if ty.async_ {
1212 FunctionKind::AsyncMethod(self.resources[&owner][name.resource().as_str()])
1213 } else {
1214 FunctionKind::Method(self.resources[&owner][name.resource().as_str()])
1215 }
1216 }
1217 ComponentNameKind::Static(name) => {
1218 if ty.async_ {
1219 FunctionKind::AsyncStatic(self.resources[&owner][name.resource().as_str()])
1220 } else {
1221 FunctionKind::Static(self.resources[&owner][name.resource().as_str()])
1222 }
1223 }
1224
1225 ComponentNameKind::Interface(_)
1227 | ComponentNameKind::Url(_)
1228 | ComponentNameKind::Hash(_)
1229 | ComponentNameKind::Dependency(_) => unreachable!(),
1230 },
1231
1232 name: name.to_string(),
1237 params,
1238 result,
1239 span: Default::default(),
1240 })
1241 }
1242
1243 fn convert_valtype(&mut self, ty: &ComponentValType) -> Result<Type> {
1244 let id = match ty {
1245 ComponentValType::Primitive(ty) => return Ok(self.convert_primitive(*ty)),
1246 ComponentValType::Type(id) => *id,
1247 };
1248
1249 let key: ComponentAnyTypeId = id.into();
1251 if let Some(ret) = self.type_map.get(&key) {
1252 return Ok(Type::Id(*ret));
1253 }
1254
1255 let def = &self.types[id];
1261 let kind = self.convert_defined(def)?;
1262 match &kind {
1263 TypeDefKind::Type(_)
1264 | TypeDefKind::List(_)
1265 | TypeDefKind::Map(_, _)
1266 | TypeDefKind::FixedLengthList(..)
1267 | TypeDefKind::Tuple(_)
1268 | TypeDefKind::Option(_)
1269 | TypeDefKind::Result(_)
1270 | TypeDefKind::Handle(_)
1271 | TypeDefKind::Future(_)
1272 | TypeDefKind::Stream(_) => {}
1273
1274 TypeDefKind::Resource
1275 | TypeDefKind::Record(_)
1276 | TypeDefKind::Enum(_)
1277 | TypeDefKind::Variant(_)
1278 | TypeDefKind::Flags(_) => {
1279 bail!("unexpected unnamed type of kind '{}'", kind.as_str());
1280 }
1281 TypeDefKind::Unknown => unreachable!(),
1282 }
1283 let ty = self.resolve.types.alloc(TypeDef {
1284 name: None,
1285 docs: Default::default(),
1286 stability: Default::default(),
1287 owner: TypeOwner::None,
1288 kind,
1289 span: Default::default(),
1290 external_id: None,
1291 });
1292 let prev = self.type_map.insert(id.into(), ty);
1293 assert!(prev.is_none());
1294 Ok(Type::Id(ty))
1295 }
1296
1297 fn convert_defined(&mut self, ty: &ComponentDefinedType) -> Result<TypeDefKind> {
1301 match ty {
1302 ComponentDefinedType::Primitive(t) => Ok(TypeDefKind::Type(self.convert_primitive(*t))),
1303
1304 ComponentDefinedType::List { element, .. } => {
1305 let t = self.convert_valtype(element)?;
1306 Ok(TypeDefKind::List(t))
1307 }
1308
1309 ComponentDefinedType::Map { key, value, .. } => {
1310 let k = self.convert_valtype(key)?;
1311 let v = self.convert_valtype(value)?;
1312 Ok(TypeDefKind::Map(k, v))
1313 }
1314
1315 ComponentDefinedType::FixedLengthList {
1316 element, length, ..
1317 } => {
1318 let t = self.convert_valtype(element)?;
1319 Ok(TypeDefKind::FixedLengthList(t, *length))
1320 }
1321
1322 ComponentDefinedType::Tuple(t) => {
1323 let types = t
1324 .types
1325 .iter()
1326 .map(|t| self.convert_valtype(t))
1327 .collect::<Result<_>>()?;
1328 Ok(TypeDefKind::Tuple(Tuple { types }))
1329 }
1330
1331 ComponentDefinedType::Option { ty, .. } => {
1332 let t = self.convert_valtype(ty)?;
1333 Ok(TypeDefKind::Option(t))
1334 }
1335
1336 ComponentDefinedType::Result { ok, err, .. } => {
1337 let ok = match ok {
1338 Some(t) => Some(self.convert_valtype(t)?),
1339 None => None,
1340 };
1341 let err = match err {
1342 Some(t) => Some(self.convert_valtype(t)?),
1343 None => None,
1344 };
1345 Ok(TypeDefKind::Result(Result_ { ok, err }))
1346 }
1347
1348 ComponentDefinedType::Record(r) => {
1349 let fields = r
1350 .fields
1351 .iter()
1352 .map(|(name, ty)| {
1353 Ok(Field {
1354 name: name.to_string(),
1355 ty: self.convert_valtype(ty).with_context(|| {
1356 format!("failed to convert record field '{name}'")
1357 })?,
1358 docs: Default::default(),
1359 span: Default::default(),
1360 })
1361 })
1362 .collect::<Result<_>>()?;
1363 Ok(TypeDefKind::Record(Record { fields }))
1364 }
1365
1366 ComponentDefinedType::Variant(v) => {
1367 let cases = v
1368 .cases
1369 .iter()
1370 .map(|(name, case)| {
1371 Ok(Case {
1372 name: name.to_string(),
1373 ty: match &case.ty {
1374 Some(ty) => Some(self.convert_valtype(ty)?),
1375 None => None,
1376 },
1377 docs: Default::default(),
1378 span: Default::default(),
1379 })
1380 })
1381 .collect::<Result<_>>()?;
1382 Ok(TypeDefKind::Variant(Variant { cases }))
1383 }
1384
1385 ComponentDefinedType::Flags(f) => {
1386 let flags = f
1387 .iter()
1388 .map(|name| Flag {
1389 name: name.to_string(),
1390 docs: Default::default(),
1391 span: Default::default(),
1392 })
1393 .collect();
1394 Ok(TypeDefKind::Flags(Flags { flags }))
1395 }
1396
1397 ComponentDefinedType::Enum(e) => {
1398 let cases = e
1399 .iter()
1400 .cloned()
1401 .map(|name| EnumCase {
1402 name: name.into(),
1403 docs: Default::default(),
1404 span: Default::default(),
1405 })
1406 .collect();
1407 Ok(TypeDefKind::Enum(Enum { cases }))
1408 }
1409
1410 ComponentDefinedType::Own(id) => {
1411 let key: ComponentAnyTypeId = (*id).into();
1412 let id = self.type_map[&key];
1413 Ok(TypeDefKind::Handle(Handle::Own(id)))
1414 }
1415
1416 ComponentDefinedType::Borrow(id) => {
1417 let key: ComponentAnyTypeId = (*id).into();
1418 let id = self.type_map[&key];
1419 Ok(TypeDefKind::Handle(Handle::Borrow(id)))
1420 }
1421
1422 ComponentDefinedType::Future { ty, .. } => Ok(TypeDefKind::Future(
1423 ty.as_ref().map(|ty| self.convert_valtype(ty)).transpose()?,
1424 )),
1425
1426 ComponentDefinedType::Stream { ty, .. } => Ok(TypeDefKind::Stream(
1427 ty.as_ref().map(|ty| self.convert_valtype(ty)).transpose()?,
1428 )),
1429 }
1430 }
1431
1432 fn convert_primitive(&self, ty: PrimitiveValType) -> Type {
1433 match ty {
1434 PrimitiveValType::U8 => Type::U8,
1435 PrimitiveValType::S8 => Type::S8,
1436 PrimitiveValType::U16 => Type::U16,
1437 PrimitiveValType::S16 => Type::S16,
1438 PrimitiveValType::U32 => Type::U32,
1439 PrimitiveValType::S32 => Type::S32,
1440 PrimitiveValType::U64 => Type::U64,
1441 PrimitiveValType::S64 => Type::S64,
1442 PrimitiveValType::Bool => Type::Bool,
1443 PrimitiveValType::Char => Type::Char,
1444 PrimitiveValType::String => Type::String,
1445 PrimitiveValType::F32 => Type::F32,
1446 PrimitiveValType::F64 => Type::F64,
1447 PrimitiveValType::ErrorContext => Type::ErrorContext,
1448 }
1449 }
1450
1451 fn register_defined(&mut self, id: TypeId, def: &ComponentDefinedType) -> Result<()> {
1452 Registrar {
1453 types: &self.types,
1454 type_map: &mut self.type_map,
1455 resolve: &self.resolve,
1456 }
1457 .defined(id, def)
1458 }
1459
1460 fn finish(mut self, package: Package) -> (Resolve, PackageId) {
1465 let mut order = IndexSet::default();
1468 for i in 0..self.foreign_packages.len() {
1469 self.visit_package(i, &mut order);
1470 }
1471
1472 let mut idx_to_pos = vec![0; self.foreign_packages.len()];
1475 for (pos, idx) in order.iter().enumerate() {
1476 idx_to_pos[*idx] = pos;
1477 }
1478 let mut deps = mem::take(&mut self.foreign_packages)
1481 .into_iter()
1482 .enumerate()
1483 .collect::<Vec<_>>();
1484 deps.sort_by_key(|(idx, _)| idx_to_pos[*idx]);
1485
1486 for (_idx, (_url, pkg)) in deps {
1489 self.insert_package(pkg);
1490 }
1491
1492 let id = self.insert_package(package);
1493 assert!(self.resolve.worlds.iter().all(|(_, w)| w.package.is_some()));
1494 assert!(
1495 self.resolve
1496 .interfaces
1497 .iter()
1498 .all(|(_, i)| i.package.is_some())
1499 );
1500 (self.resolve, id)
1501 }
1502
1503 fn insert_package(&mut self, package: Package) -> PackageId {
1504 let Package {
1505 name,
1506 interfaces,
1507 worlds,
1508 docs,
1509 } = package;
1510
1511 let pkg = self
1517 .resolve
1518 .package_names
1519 .get(&name)
1520 .copied()
1521 .unwrap_or_else(|| {
1522 let id = self.resolve.packages.alloc(Package {
1523 name: name.clone(),
1524 interfaces: Default::default(),
1525 worlds: Default::default(),
1526 docs,
1527 });
1528 let prev = self.resolve.package_names.insert(name, id);
1529 assert!(prev.is_none());
1530 id
1531 });
1532
1533 for (name, id) in interfaces {
1534 let prev = self.resolve.packages[pkg].interfaces.insert(name, id);
1535 assert!(prev.is_none());
1536 self.resolve.interfaces[id].package = Some(pkg);
1537 }
1538
1539 for (name, id) in worlds {
1540 let prev = self.resolve.packages[pkg].worlds.insert(name, id);
1541 assert!(prev.is_none());
1542 let world = &mut self.resolve.worlds[id];
1543 world.package = Some(pkg);
1544 for (name, item) in world.imports.iter().chain(world.exports.iter()) {
1545 if let WorldKey::Name(_) = name {
1546 if let WorldItem::Interface { id, .. } = item {
1547 let iface = &mut self.resolve.interfaces[*id];
1548 if iface.name.is_none() {
1549 iface.package = Some(pkg);
1550 }
1551 }
1552 }
1553 }
1554 }
1555
1556 pkg
1557 }
1558
1559 fn visit_package(&self, idx: usize, order: &mut IndexSet<usize>) {
1560 if order.contains(&idx) {
1561 return;
1562 }
1563
1564 let (_name, pkg) = self.foreign_packages.get_index(idx).unwrap();
1565 let interfaces = pkg.interfaces.values().copied().chain(
1566 pkg.worlds
1567 .values()
1568 .flat_map(|w| {
1569 let world = &self.resolve.worlds[*w];
1570 world.imports.values().chain(world.exports.values())
1571 })
1572 .filter_map(|item| match item {
1573 WorldItem::Interface { id, .. } => Some(*id),
1574 WorldItem::Function(_) | WorldItem::Type { .. } => None,
1575 }),
1576 );
1577 for iface in interfaces {
1578 for dep in self.resolve.interface_direct_deps(iface) {
1579 let dep_idx = self.iface_to_package_index[&dep];
1580 if dep_idx != idx {
1581 self.visit_package(dep_idx, order);
1582 }
1583 }
1584 }
1585
1586 assert!(order.insert(idx));
1587 }
1588}
1589
1590struct Registrar<'a> {
1593 types: &'a Types,
1594 type_map: &'a mut HashMap<ComponentAnyTypeId, TypeId>,
1595 resolve: &'a Resolve,
1596}
1597
1598impl Registrar<'_> {
1599 fn defined(&mut self, id: TypeId, def: &ComponentDefinedType) -> Result<()> {
1602 match def {
1603 ComponentDefinedType::Primitive(_) => Ok(()),
1604
1605 ComponentDefinedType::List { element, .. } => {
1606 let ty = match &self.resolve.types[id].kind {
1607 TypeDefKind::List(r) => r,
1608 TypeDefKind::Type(Type::Id(_)) => return Ok(()),
1616 _ => bail!("expected a list"),
1617 };
1618 self.valtype(element, ty)
1619 }
1620
1621 ComponentDefinedType::Map { key, value, .. } => {
1622 let (key_ty, value_ty) = match &self.resolve.types[id].kind {
1623 TypeDefKind::Map(k, v) => (k, v),
1624 TypeDefKind::Type(Type::Id(_)) => return Ok(()),
1625 _ => bail!("expected a map"),
1626 };
1627 self.valtype(key, key_ty)?;
1628 self.valtype(value, value_ty)
1629 }
1630
1631 ComponentDefinedType::FixedLengthList {
1632 element, length, ..
1633 } => {
1634 let ty = match &self.resolve.types[id].kind {
1635 TypeDefKind::FixedLengthList(r, elements2) if elements2 == length => r,
1636 TypeDefKind::Type(Type::Id(_)) => return Ok(()),
1637 _ => bail!("expected a fixed-length {length} list"),
1638 };
1639 self.valtype(element, ty)
1640 }
1641
1642 ComponentDefinedType::Tuple(t) => {
1643 let ty = match &self.resolve.types[id].kind {
1644 TypeDefKind::Tuple(r) => r,
1645 TypeDefKind::Type(Type::Id(_)) => return Ok(()),
1646 _ => bail!("expected a tuple"),
1647 };
1648 if ty.types.len() != t.types.len() {
1649 bail!("mismatched number of tuple fields");
1650 }
1651 for (a, b) in t.types.iter().zip(ty.types.iter()) {
1652 self.valtype(a, b)?;
1653 }
1654 Ok(())
1655 }
1656
1657 ComponentDefinedType::Option { ty: t, .. } => {
1658 let ty = match &self.resolve.types[id].kind {
1659 TypeDefKind::Option(r) => r,
1660 TypeDefKind::Type(Type::Id(_)) => return Ok(()),
1661 _ => bail!("expected an option"),
1662 };
1663 self.valtype(t, ty)
1664 }
1665
1666 ComponentDefinedType::Result { ok, err, .. } => {
1667 let ty = match &self.resolve.types[id].kind {
1668 TypeDefKind::Result(r) => r,
1669 TypeDefKind::Type(Type::Id(_)) => return Ok(()),
1670 _ => bail!("expected a result"),
1671 };
1672 match (ok, &ty.ok) {
1673 (Some(a), Some(b)) => self.valtype(a, b)?,
1674 (None, None) => {}
1675 _ => bail!("disagreement on result structure"),
1676 }
1677 match (err, &ty.err) {
1678 (Some(a), Some(b)) => self.valtype(a, b)?,
1679 (None, None) => {}
1680 _ => bail!("disagreement on result structure"),
1681 }
1682 Ok(())
1683 }
1684
1685 ComponentDefinedType::Record(def) => {
1686 let ty = match &self.resolve.types[id].kind {
1687 TypeDefKind::Record(r) => r,
1688 TypeDefKind::Type(Type::Id(_)) => return Ok(()),
1689 _ => bail!("expected a record"),
1690 };
1691 if def.fields.len() != ty.fields.len() {
1692 bail!("mismatched number of record fields");
1693 }
1694 for ((name, ty), field) in def.fields.iter().zip(&ty.fields) {
1695 if name.as_str() != field.name {
1696 bail!("mismatched field order");
1697 }
1698 self.valtype(ty, &field.ty)?;
1699 }
1700 Ok(())
1701 }
1702
1703 ComponentDefinedType::Variant(def) => {
1704 let ty = match &self.resolve.types[id].kind {
1705 TypeDefKind::Variant(r) => r,
1706 TypeDefKind::Type(Type::Id(_)) => return Ok(()),
1707 _ => bail!("expected a variant"),
1708 };
1709 if def.cases.len() != ty.cases.len() {
1710 bail!("mismatched number of variant cases");
1711 }
1712 for ((name, ty), case) in def.cases.iter().zip(&ty.cases) {
1713 if name.as_str() != case.name {
1714 bail!("mismatched case order");
1715 }
1716 match (&ty.ty, &case.ty) {
1717 (Some(a), Some(b)) => self.valtype(a, b)?,
1718 (None, None) => {}
1719 _ => bail!("disagreement on case type"),
1720 }
1721 }
1722 Ok(())
1723 }
1724
1725 ComponentDefinedType::Future { ty: payload, .. } => {
1726 let ty = match &self.resolve.types[id].kind {
1727 TypeDefKind::Future(p) => p,
1728 TypeDefKind::Type(Type::Id(_)) => return Ok(()),
1729 _ => bail!("expected a future"),
1730 };
1731 match (payload, ty) {
1732 (Some(a), Some(b)) => self.valtype(a, b),
1733 (None, None) => Ok(()),
1734 _ => bail!("disagreement on future payload"),
1735 }
1736 }
1737
1738 ComponentDefinedType::Stream { ty: payload, .. } => {
1739 let ty = match &self.resolve.types[id].kind {
1740 TypeDefKind::Stream(p) => p,
1741 TypeDefKind::Type(Type::Id(_)) => return Ok(()),
1742 _ => bail!("expected a stream"),
1743 };
1744 match (payload, ty) {
1745 (Some(a), Some(b)) => self.valtype(a, b),
1746 (None, None) => Ok(()),
1747 _ => bail!("disagreement on stream payload"),
1748 }
1749 }
1750
1751 ComponentDefinedType::Flags(_)
1753 | ComponentDefinedType::Enum(_)
1754 | ComponentDefinedType::Own(_)
1755 | ComponentDefinedType::Borrow(_) => Ok(()),
1756 }
1757 }
1758
1759 fn valtype(&mut self, wasm: &ComponentValType, wit: &Type) -> Result<()> {
1760 let wasm = match wasm {
1761 ComponentValType::Type(wasm) => *wasm,
1762 ComponentValType::Primitive(_wasm) => {
1763 assert!(!matches!(wit, Type::Id(_)));
1764 return Ok(());
1765 }
1766 };
1767 let wit = match wit {
1768 Type::Id(id) => *id,
1769 _ => bail!("expected id-based type"),
1770 };
1771 let prev = match self.type_map.insert(wasm.into(), wit) {
1772 Some(prev) => prev,
1773 None => {
1774 let wasm = &self.types[wasm];
1775 return self.defined(wit, wasm);
1776 }
1777 };
1778 let _ = prev;
1861 Ok(())
1862 }
1863}
1864
1865pub(crate) trait InterfaceNameExt {
1866 fn to_package_name(&self, item: &ComponentItem) -> Result<PackageName>;
1867}
1868
1869impl InterfaceNameExt for wasmparser::names::InterfaceName<'_> {
1870 fn to_package_name(&self, item: &ComponentItem) -> Result<PackageName> {
1871 Ok(PackageName {
1872 namespace: self.namespace().to_string(),
1873 name: self.package().to_string(),
1874 version: self.version(item.version_suffix.as_deref())?,
1875 })
1876 }
1877}