From e960dde52cb705f1f3858588eff330e9784c476d Mon Sep 17 00:00:00 2001 From: Daniel Macovei Date: Mon, 24 Jun 2024 13:46:28 -0500 Subject: [PATCH] nested interfaces --- design/mvp/WIT.md | 57 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) diff --git a/design/mvp/WIT.md b/design/mvp/WIT.md index eec4b325..ea1fe010 100644 --- a/design/mvp/WIT.md +++ b/design/mvp/WIT.md @@ -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 @@ -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 @@ -660,6 +660,59 @@ 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 export other interfaces via the `nest` keyword. +With the `nest` keyword, one can reference other interfaces in the same package, foreign packages, or simply 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 would be encoded as: + +```wasm +(component + (type (;0;) + (instance + ... `types from foo` + ) + ) + (export "local:example/foo" (type 0)) + (type (;1;) + (instance + (alias outer 0 0 (type (;0;))) + (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)) +) +``` + ## WIT Functions [functions]: #wit-functions