|
1 | 1 | use crate::encoding::types::{FunctionKey, ValtypeEncoder};
|
2 |
| -use anyhow::{bail, Result}; |
| 2 | +use anyhow::Result; |
3 | 3 | use indexmap::IndexSet;
|
4 | 4 | use std::collections::HashMap;
|
5 | 5 | use std::mem;
|
@@ -226,6 +226,20 @@ impl InterfaceEncoder<'_> {
|
226 | 226 | .export(name, ComponentTypeRef::Func(ty));
|
227 | 227 | }
|
228 | 228 | let mut instance = self.pop_instance();
|
| 229 | + self.encode_nested(iface, &mut instance)?; |
| 230 | + |
| 231 | + let idx = self.outer.type_count(); |
| 232 | + self.outer.ty().instance(&instance); |
| 233 | + self.import_map.insert(interface, self.instances); |
| 234 | + self.instances += 1; |
| 235 | + Ok(idx) |
| 236 | + } |
| 237 | + |
| 238 | + fn encode_nested<'a>( |
| 239 | + &'a mut self, |
| 240 | + iface: &Interface, |
| 241 | + instance: &'a mut InstanceType, |
| 242 | + ) -> Result<&mut InstanceType> { |
229 | 243 | for (orig_name, _) in &iface.nested {
|
230 | 244 | let mut pkg_parts = orig_name.split("/");
|
231 | 245 | let pkg = pkg_parts.next().expect("expected projection");
|
@@ -255,23 +269,40 @@ impl InterfaceEncoder<'_> {
|
255 | 269 | }
|
256 | 270 | inst.encode_valtype(self.resolve, &Type::Id(*id))?;
|
257 | 271 | }
|
258 |
| - for (_, _) in &nested_iface.nested { |
259 |
| - bail!("Using `nest` in a nested interface is not yet supported"); |
260 |
| - } |
261 | 272 | let ty = instance.ty();
|
262 |
| - let nested = inst.pop_instance(); |
263 |
| - ty.instance(&nested); |
| 273 | + let nested_instance = &mut inst.pop_instance(); |
| 274 | + for (orig_name, _) in &nested_iface.nested { |
| 275 | + let mut nest_package_parts = orig_name.split("/"); |
| 276 | + let nest_pkg = nest_package_parts.next().unwrap(); |
| 277 | + let nest_iface = nest_package_parts.next().unwrap(); |
| 278 | + let mut parts = nest_pkg.split(":"); |
| 279 | + let ns = parts.next().unwrap(); |
| 280 | + let name = parts.next().unwrap(); |
| 281 | + let name = PackageName { |
| 282 | + namespace: ns.to_string(), |
| 283 | + name: name.to_string(), |
| 284 | + version: None, |
| 285 | + }; |
| 286 | + let nest_pkg_id = self.resolve.package_names.get(&name).unwrap(); |
| 287 | + let nested_package = &self.resolve.packages[*nest_pkg_id]; |
| 288 | + let myguy = nested_package.interfaces.get(nest_iface).unwrap(); |
| 289 | + let nest = &self.resolve.interfaces[*myguy]; |
| 290 | + let mut clone = nested_instance.clone(); |
| 291 | + let deep_instance = self.encode_nested(nest, &mut clone)?; |
| 292 | + let deep_ty = nested_instance.ty(); |
| 293 | + deep_ty.instance(&deep_instance); |
| 294 | + nested_instance.export( |
| 295 | + orig_name, |
| 296 | + ComponentTypeRef::Instance(deep_instance.type_count()), |
| 297 | + ); |
| 298 | + } |
| 299 | + ty.instance(&nested_instance); |
264 | 300 | instance.export(
|
265 | 301 | orig_name,
|
266 | 302 | ComponentTypeRef::Instance(instance.type_count() - 1),
|
267 | 303 | );
|
268 | 304 | }
|
269 |
| - |
270 |
| - let idx = self.outer.type_count(); |
271 |
| - self.outer.ty().instance(&instance); |
272 |
| - self.import_map.insert(interface, self.instances); |
273 |
| - self.instances += 1; |
274 |
| - Ok(idx) |
| 305 | + Ok(instance) |
275 | 306 | }
|
276 | 307 |
|
277 | 308 | fn push_instance(&mut self) {
|
|
0 commit comments