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