Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 73 additions & 2 deletions design/mvp/WIT.md
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ would correspond to:
)
```

An `interface` can contain [`use`][use] statements, [type][types] definitions,
An `interface` can contain [`use`][use] and [`nest`][nest] statements, [type][types] definitions,
and [function][functions] definitions. For example:

```wit
Expand All @@ -136,7 +136,7 @@ interface types {
}
```

More information about [`use`][use] and [types] are described below, but this
More information about [`use`][use], [`nest`][nest], and [types] are described below, but this
is an example of a collection of items within an `interface`. All items defined
in an `interface`, including [`use`][use] items, are considered as exports from
the interface. This means that types can further be used from the interface by
Expand Down Expand Up @@ -660,6 +660,73 @@ world w2 {
> configure that a `use`'d interface is a particular import or a particular
> export.

## Nesting WIT interfaces
[nest]: #nesting-wit-interfaces
Interfaces can also contain other interfaces via the `nest` keyword.
With the `nest` keyword, one can reference other interfaces in the same package, foreign packages, or define anonymous interfaces inline.

```wit
package local:example;

interface foo {
...
}

interface top {
nest foo;
nest foreign:pkg/bar;
baz: interface {
...
}
}
```

Each of these forms of nesting interfaces are encoded as:

```wasm
(component
(type (;0;)
(component
(type (;0;)
(instance
... `types from foo`
)
)
(export "local:example/foo" (type 0))
)
)
(export (;1;) "foo" (type 0))
(type (;2;)
(component
(type (;0;)
(instance
(type (;0;)
(instance
... `types from foo`
)
)
(export "local:example/foo" (instance (type 0)))
(type (;1;)
(instance
... `types from foreign:pkg/bar`
)
)
(export "foreign:pkg/bar" (instance (type 1)))
(type (;2;)
(instance
... `types from baz`
)
)
(export "baz" (instance (type 2)))
)
)
(export "local:example/top (type 1))
)
)
(export (;3;) "top" (type 2))
)
```

## WIT Functions
[functions]: #wit-functions

Expand Down Expand Up @@ -1106,6 +1173,7 @@ interface-items ::= gate interface-definition
interface-definition ::= typedef-item
| use-item
| func-item
| nest-item

typedef-item ::= resource-item
| variant-items
Expand All @@ -1128,6 +1196,9 @@ named-type-list ::= ϵ
| named-type ( ',' named-type )*

named-type ::= id ':' ty

nest-item ::= gate nest use-path ';'
| id: interface-item
```


Expand Down