Skip to content

Commit c9ee248

Browse files
committed
versioned nest package names and general tidying
1 parent e91ccd5 commit c9ee248

File tree

11 files changed

+125
-222
lines changed

11 files changed

+125
-222
lines changed

crates/wit-component/src/encoding/wit/v1.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,11 +171,8 @@ impl InterfaceEncoder<'_> {
171171
let mut type_order = IndexSet::new();
172172
for (_, id) in iface.types.iter() {
173173
let ty = &self.resolve.types[*id];
174-
match ty.owner {
175-
TypeOwner::Interface(iface_id) => {
176-
self.interface = Some(iface_id);
177-
}
178-
_ => unreachable!(),
174+
if let TypeOwner::Interface(iface_id) = ty.owner {
175+
self.interface = Some(iface_id);
179176
}
180177
self.encode_valtype(self.resolve, &Type::Id(*id))?;
181178
type_order.insert(*id);

crates/wit-component/src/encoding/wit/v2.rs

Lines changed: 23 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -185,11 +185,8 @@ impl InterfaceEncoder<'_> {
185185
let mut type_order = IndexSet::new();
186186
for (_, id) in iface.types.iter() {
187187
let ty = &self.resolve.types[*id];
188-
match ty.owner {
189-
TypeOwner::Interface(iface_id) => {
190-
self.interface = Some(iface_id);
191-
}
192-
_ => unreachable!(),
188+
if let TypeOwner::Interface(iface_id) = ty.owner {
189+
self.interface = Some(iface_id);
193190
}
194191
self.encode_valtype(self.resolve, &Type::Id(*id))?;
195192
type_order.insert(*id);
@@ -240,65 +237,47 @@ impl InterfaceEncoder<'_> {
240237
iface: &Interface,
241238
instance: &'a mut InstanceType,
242239
) -> Result<&mut InstanceType> {
243-
for (orig_name, _) in &iface.nested {
244-
let mut pkg_parts = orig_name.split("/");
245-
let pkg = pkg_parts.next().expect("expected projection");
246-
let iface_name = pkg_parts.next().expect("expected projection");
247-
let mut parts = pkg.split(":");
248-
let namespace = parts.next().expect("expected <namespace>:<id>");
249-
let name = parts.next().expect("expected <namespace>:<id>");
250-
let name = PackageName {
251-
namespace: namespace.to_string(),
252-
name: name.to_string(),
253-
version: None,
254-
};
255-
256-
let package_id = self.resolve.package_names.get(&name).unwrap();
240+
for (nest_name, nest_item) in &iface.nested {
241+
let package_id = self
242+
.resolve
243+
.package_names
244+
.get(&nest_item.package_name)
245+
.unwrap();
257246
let package = &self.resolve.packages[*package_id];
258-
let nested = package.interfaces.get(iface_name).unwrap();
247+
let nested = package.interfaces.get(&nest_item.iface_name).unwrap();
259248
let nested_iface = &self.resolve.interfaces[*nested];
260249
let mut inst = InterfaceEncoder::new(&self.resolve);
261250
inst.push_instance();
262251
for (_, id) in &nested_iface.types {
263252
let ty = &self.resolve.types[*id];
264-
match ty.owner {
265-
TypeOwner::Interface(iface_id) => {
266-
inst.interface = Some(iface_id);
267-
}
268-
_ => unreachable!(),
253+
if let TypeOwner::Interface(iface_id) = ty.owner {
254+
inst.interface = Some(iface_id);
269255
}
270256
inst.encode_valtype(self.resolve, &Type::Id(*id))?;
271257
}
272258
let ty = instance.ty();
273259
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];
260+
for (nest_name, deep_nest) in &nested_iface.nested {
261+
let deep_pkg_id = self
262+
.resolve
263+
.package_names
264+
.get(&deep_nest.package_name)
265+
.unwrap();
266+
let deep_package = &self.resolve.packages[*deep_pkg_id];
267+
let deep_iface_id = deep_package.interfaces.get(&deep_nest.iface_name).unwrap();
268+
let deep_nest = &self.resolve.interfaces[*deep_iface_id];
290269
let mut clone = nested_instance.clone();
291-
let deep_instance = self.encode_nested(nest, &mut clone)?;
270+
let deep_instance = self.encode_nested(deep_nest, &mut clone)?;
292271
let deep_ty = nested_instance.ty();
293272
deep_ty.instance(&deep_instance);
294273
nested_instance.export(
295-
orig_name,
274+
nest_name,
296275
ComponentTypeRef::Instance(deep_instance.type_count()),
297276
);
298277
}
299278
ty.instance(&nested_instance);
300279
instance.export(
301-
orig_name,
280+
nest_name,
302281
ComponentTypeRef::Instance(instance.type_count() - 1),
303282
);
304283
}

crates/wit-component/tests/interfaces.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ fn run_test(path: &Path, is_dir: bool) -> Result<()> {
5353
} else {
5454
resolve.append(UnresolvedPackageGroup::parse_file(path)?)?
5555
};
56+
5657
for package in packages {
5758
assert_print(&resolve, &[package], path, is_dir)?;
5859

@@ -76,6 +77,7 @@ fn run_test(path: &Path, is_dir: bool) -> Result<()> {
7677
decoded.packages().len(),
7778
"Each input WIT package should produce WASM that contains only one package"
7879
);
80+
7981
let decoded_package = decoded.packages()[0];
8082
let resolve = decoded.resolve();
8183

crates/wit-component/tests/interfaces/nested.wat

Lines changed: 11 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -4,112 +4,36 @@
44
(type (;0;)
55
(instance
66
(type (;0;) (record (field "foo" string)))
7-
(export (;1;) "usable-record" (type (eq 0)))
8-
)
9-
)
10-
(import "foo:nestee/usable" (instance (;0;) (type 0)))
11-
(alias export 0 "usable-record" (type (;1;)))
12-
(type (;2;)
13-
(instance
14-
(alias outer 1 1 (type (;0;)))
15-
(export (;1;) "usable-record" (type (eq 0)))
16-
(type (;2;) (record (field "foo" string)))
17-
(export (;3;) "my-record" (type (eq 2)))
18-
(type (;4;) (func (result string)))
19-
(export (;0;) "hello" (func (type 4)))
20-
(type (;5;)
7+
(export (;1;) "my-record" (type (eq 0)))
8+
(type (;2;) (func (result string)))
9+
(export (;0;) "hello" (func (type 2)))
10+
(type (;3;)
2111
(instance
2212
(type (;0;) (record (field "foo" string)))
23-
(export (;1;) "nestrecord" (type (eq 0)))
13+
(export (;1;) "nest-record" (type (eq 0)))
2414
(type (;2;)
2515
(instance
2616
(type (;0;) (record (field "foo" string)))
27-
(export (;1;) "nestrecord" (type (eq 0)))
17+
(export (;1;) "nest-record" (type (eq 0)))
2818
)
2919
)
3020
(export (;0;) "foo:nestnest/deep" (instance (type 2)))
3121
)
3222
)
33-
(export (;0;) "foo:nestee/things" (instance (type 5)))
34-
(type (;6;)
23+
(export (;0;) "foo:nestee/things@1.0.0" (instance (type 3)))
24+
(type (;4;)
3525
(instance
3626
(export (;0;) "foo" (type (sub resource)))
3727
)
3828
)
39-
(export (;1;) "foo:nestee/more" (instance (type 6)))
29+
(export (;1;) "foo:nestee/more@1.0.0" (instance (type 4)))
4030
)
4131
)
42-
(export (;1;) "foo:thing/something" (instance (type 2)))
32+
(export (;0;) "foo:thing/something" (instance (type 0)))
4333
)
4434
)
4535
(export (;1;) "something" (type 0))
46-
(type (;2;)
47-
(component
48-
(type (;0;)
49-
(instance
50-
(type (;0;) (list u8))
51-
(export (;1;) "random" (type (eq 0)))
52-
)
53-
)
54-
(export (;0;) "foo:thing/flat" (instance (type 0)))
55-
)
56-
)
57-
(export (;3;) "flat" (type 2))
58-
(type (;4;)
59-
(component
60-
(type (;0;)
61-
(component
62-
(type (;0;)
63-
(instance
64-
(type (;0;) (record (field "foo" string)))
65-
(export (;1;) "usable-record" (type (eq 0)))
66-
)
67-
)
68-
(import "foo:nestee/usable" (instance (;0;) (type 0)))
69-
(alias export 0 "usable-record" (type (;1;)))
70-
(type (;2;)
71-
(instance
72-
(alias outer 1 1 (type (;0;)))
73-
(export (;1;) "usable-record" (type (eq 0)))
74-
(type (;2;) (record (field "foo" string)))
75-
(export (;3;) "my-record" (type (eq 2)))
76-
(type (;4;) (func (result string)))
77-
(export (;0;) "hello" (func (type 4)))
78-
)
79-
)
80-
(import "foo:thing/something" (instance (;1;) (type 2)))
81-
(type (;3;)
82-
(instance
83-
(type (;0;) (list u8))
84-
(export (;1;) "random" (type (eq 0)))
85-
)
86-
)
87-
(import "foo:thing/flat" (instance (;2;) (type 3)))
88-
(type (;4;)
89-
(instance
90-
(alias outer 1 1 (type (;0;)))
91-
(export (;1;) "usable-record" (type (eq 0)))
92-
(type (;2;) (record (field "foo" string)))
93-
(export (;3;) "my-record" (type (eq 2)))
94-
(type (;4;) (func (result string)))
95-
(export (;0;) "hello" (func (type 4)))
96-
)
97-
)
98-
(export (;3;) "foo:thing/something" (instance (type 4)))
99-
(type (;5;)
100-
(instance
101-
(type (;0;) (list u8))
102-
(export (;1;) "random" (type (eq 0)))
103-
)
104-
)
105-
(export (;4;) "foo:thing/flat" (instance (type 5)))
106-
)
107-
)
108-
(export (;0;) "foo:thing/my-world" (component (type 0)))
109-
)
110-
)
111-
(export (;5;) "my-world" (type 4))
112-
(@custom "package-docs" "\01{\22interfaces\22:{\22something\22:{\22types\22:{\22my-record\22:{\22stability\22:{\22stable\22:{\22since\22:\221.0.0\22}}}},\22nested\22:{\22foo:nestee/things\22:{\22docs\22:{\22contents\22:\22nesting can be documented\22},\22stability\22:\22unknown\22},\22foo:nestee/more\22:{\22docs\22:{\22contents\22:null},\22stability\22:{\22stable\22:{\22since\22:\221.0.0\22}}}}}}}")
36+
(@custom "package-docs" "\01{\22interfaces\22:{\22something\22:{\22types\22:{\22my-record\22:{\22stability\22:{\22stable\22:{\22since\22:\221.0.0\22}}}},\22nested\22:{\22foo:nestee/[email protected]\22:{\22docs\22:{\22contents\22:\22nesting can be documented\22},\22stability\22:\22unknown\22},\22foo:nestee/[email protected]\22:{\22docs\22:{\22contents\22:null},\22stability\22:{\22stable\22:{\22since\22:\221.0.0\22}}}}}}}")
11337
(@producers
11438
(processed-by "wit-component" "$CARGO_PKG_VERSION")
11539
)
Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package foo:nestee;
1+
package foo:nestee@1.0.0;
22

33
interface things {
44
//nesting can be documented
55
@since(version = 1.0.0)
66
nest foo:nestnest/deep;
7-
record nestrecord {
7+
record nest-record {
88
foo: string
99
}
1010
hello: func() -> string;
@@ -14,10 +14,4 @@ interface more {
1414
resource foo {
1515
bar: func() -> option<string>;
1616
}
17-
}
18-
19-
interface usable {
20-
record usable-record {
21-
foo: string
22-
}
2317
}
Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,14 @@
11
package foo:thing;
22

33
interface something {
4-
use foo:nestee/usable.{usable-record};
54
//nesting can be documented
6-
nest foo:nestee/things;
5+
nest foo:nestee/things@1.0.0;
76
@since(version = 1.0.0)
8-
nest foo:nestee/more;
7+
nest foo:nestee/more@1.0.0;
98
@since(version = 1.0.0)
109
record my-record {
1110
foo: string
1211
}
1312

1413
hello: func() -> string;
1514
}
16-
17-
interface flat {
18-
type random = list<u8>;
19-
}
20-
21-
world my-world {
22-
import something;
23-
export something;
24-
import flat;
25-
export flat;
26-
}

crates/wit-component/tests/interfaces/nested/thing.wit.print

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@ package foo:thing;
22

33
interface something {
44
/// nesting can be documented
5-
nest foo:nestee/things;
5+
nest foo:nestee/things@1.0.0;
66
@since(version = 1.0.0)
7-
nest foo:nestee/more;
8-
use foo:nestee/usable.{usable-record};
9-
7+
nest foo:nestee/[email protected];
108
@since(version = 1.0.0)
119
record my-record {
1210
foo: string,
@@ -15,15 +13,3 @@ interface something {
1513
hello: func() -> string;
1614
}
1715

18-
interface flat {
19-
type random = list<u8>;
20-
}
21-
22-
world my-world {
23-
import foo:nestee/usable;
24-
import something;
25-
import flat;
26-
27-
export something;
28-
export flat;
29-
}

0 commit comments

Comments
 (0)