wasmtime-cli 46.0.2

Command-line interface for Wasmtime
Documentation
;; valid usages of `implements`
(component
  (component
    (import "a" (implements "a:b/c") (instance))
    (import "b" (implements "a:b/c") (instance))
    (import "c" (implements "a:b/c@1.0.0") (instance))
    (import "my-label" (implements "ns:pkg/iface") (instance))
    (import "a:b/c" (instance))
    (import "a:b/c@1.0.0" (instance))

    (instance $a)

    (export "a" (implements "a:b/c") (instance $a))
    (export "b" (implements "a:b/c") (instance $a))
    (export "c" (implements "a:b/c@1.0.0") (instance $a))
    (export "my-label" (implements "ns:pkg/iface") (instance $a))
    (export "a:b/c" (instance $a))
    (export "a:b/c@1.0.0" (instance $a))
  )

  (type (instance
    (export "a" (implements "a:b/c") (instance))
  ))
  (type (component
    (import "a" (implements "a:b/c") (instance))
    (export "a" (implements "a:b/c") (instance))
  ))

  (instance $a)
  (instance
    (export "a" (implements "a:b/c") (instance $a))
  )
)

;; invalid, `not-valid` should be something like `a:b/c`
(assert_invalid
  (component (import "a" (implements "not-valid") (instance)))
  "must be an interface")

;; invalid, `""` must be a valid kebab-name.
(assert_invalid
  (component (import "a" (implements "") (instance)))
  "not a valid name")

;; invalid, can't import the same plain-name twice.
(assert_invalid
  (component
    (import "a" (implements "a:b/c") (instance))
    (import "a" (implements "a:b/c") (instance))
  )
  "conflicts with previous name")

;; invalid, can't import the same plain-name twice.
(assert_invalid
  (component
    (import "a" (implements "a1:b/c") (instance))
    (import "a" (implements "a2:b/c") (instance))
  )
  "conflicts with previous name")

;; invalid, can't import the same plain-name twice.
(assert_invalid
  (component
    (import "a" (implements "a:b/c") (instance))
    (import "a" (implements "a:b/c@1.0.0") (instance))
  )
  "conflicts with previous name")

;; invalid, can't import the same plain-name twice.
(assert_invalid
  (component
    (import "a" (instance))
    (import "a" (implements "a:b/c") (instance))
  )
  "conflicts with previous name")

;; invalid, `implements` can only be used by imports/exports typed as `instance`
(assert_invalid
  (component
    (import "a" (implements "a:b/c") (func))
  )
  "only instance names can have an `implements`")

;; invalid, `implements` can only be used by imports/exports named with a
;; plainname.
(assert_invalid
  (component
    (import "a1:b/c" (implements "a2:b/c") (instance))
  )
  "name `a1:b/c` is not valid with `implements`")

;; validity checks apply to other locations of `implements`, such as
;; component/instance types and bag-of-exports.
(assert_invalid
  (component (type (component (import "a" (implements "not-valid") (instance)))))
  "must be an interface")
(assert_invalid
  (component (type (component (export "a" (implements "") (instance)))))
  "not a valid name")
(assert_invalid
  (component (type (instance (export "a" (implements "a:b/c") (func)))))
  "only instance names")
(assert_invalid
  (component
    (instance)
    (instance (export "x" (implements "a") (instance 0)))
  )
  "must be an interface")